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

Sea*_*man 5 sql-server shared foreign-keys multi-tenant

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

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

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

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

所以,我的问题分为两部分:

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

Sea*_*man 5

一位同事给了我一个很好的见解。与其将租户访问视为每个租户,不如将其视为组访问。一个租户可以属于多个组,包括它自己指定的组。然后数据属于一个组,可能是租户的特定组,或者可能是更一般的组。

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

这保持了 FK 的完整性,并且还增加了拥有租户层次结构的可能性,这在我的场景中根本不需要,而是一个不错的小可能性。