【问题标题】:Multi Tenant Database with some Shared Data具有一些共享数据的多租户数据库
【发布时间】:2011-10-06 02:54:39
【问题描述】:

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

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

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

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

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

  • 有没有我没有考虑过的选项?
  • 是否有人对这些选项有过使用经验并对优点/缺点有任何反馈?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      因此,“My Bank”属于租户组,“Local Bank”属于租户可以访问的区域组,“Global Bank”属于“Everyone”组。

      这保持了 FK 的完整性,并且还增加了租户层次结构的可能性,这在我的场景中根本不需要,但可能性很小。

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 2012-12-14
        • 1970-01-01
        • 2018-07-13
        • 2019-05-18
        • 1970-01-01
        相关资源
        最近更新 更多