具有一些共享数据的多租户数据库

时间:2011-07-15 12:25:45

标签: sql-server foreign-keys shared multi-tenant

我在所有租用的数据库上都有一个完整的多租户数据库和TenantID。这一切都很好,除了现在我们要求允许租用的数据库“链接”共享数据。因此,例如,用户可以创建自己的“银行”记录并将帐户链接到他们,但他们也可以将帐户链接到所有租户共享的“全球”银行记录。

我需要一个优雅的解决方案来保持参照完整性

到目前为止我提出的方法:

  1. 复制:所有共享数据都会复制到每个租户,可能带有“系统”标志。对共享数据的更改涉及所有租户的大量更新。 可能是最简单的解决方案,但我不喜欢数据重复
  2. 特殊ID :所有指向共享数据的链接都使用特殊ID(例如负ID号)。这些表明TenantID不在关系中使用。 您不能使用FK来正确执行此操作,如果您有任何FK,肯定无法在租户中重复使用ID。只有触发器才能用于完整性。
  3. 单独的ID :所有可以链接到共享数据的表都有两个FK;一个使用TenantID并链接到本地​​数据,另一个不使用TenantID和链接到共享数据。约束表示要使用一个或另一个,而不是两者。 这可能是最“纯粹”的做法,但它似乎......丑陋,但也许不像其他人那样难看。
  4. 所以,我的问题分为两部分:

    • 我有没有考虑过任何选择?
    • 有没有人对这些选项有过经验,对优缺点有任何反馈意见?

2 个答案:

答案 0 :(得分:3)

一位同事给了我一个运作良好的见解。而不是考虑租户访问作为每个租户认为它作为组访问。租户可以属于多个组,包括它自己的指定组。然后,数据属于一个组,可能是租户的特定组,或者可能是更普遍的组。

因此,“我的银行”属于租户组,“本地银行”属于租户可以访问的区域分组,“全球银行”属于“所有人”组。

这保持了诚信,FK,并且还增加了租户等级的可能性,而不是我在我的场景中需要的东西,但是很小的可能性。

答案 1 :(得分:0)

Citus,我们正在使用PostgreSQL构建一个多租户数据库。对于共享信息,我们将其保留在我们称之为"reference" tables的内容中,这些内容确实在所有节点中复制。但是,我们使用2PC保持同步和一致,并且还可以在引用和非引用数据之间创建FK关系。 您可以找到更多信息here