多租户共享数据并按租户排除特定的默认数据

时间:2016-07-12 21:25:43

标签: mysql database postgresql database-design multi-tenant

我正在构建一个多租户应用程序,在Postgres / MySQL之上:

  • 单个数据库;
  • 单一架构;
  • 在每张桌子上使用tentant_id。

我很困惑如何在租户之间共享数据,就像信用卡品牌等默认数据一样。 所有租户都会看到这个默认的信用卡品牌。但是,他们可以删除帐户中的特定品牌。

所以,我有桌子:

  • 租户
  • credit_card_brands

我联系的可能解决方案

  • credit_card_brands的默认值可以是tenant_id = NULL,但租户如何删除? (使用tenant_excludes字段?)
  • 创建另一个表(数据透视表),tenant_credit_card_brand与之关系

我担心的是要逃避重复数据,并且易于维护。示例:如果我必须向所有租户添加新的默认值,我只会在表上插入。

我的问题:如何创建此架构?租户可以查看默认数据,可以删除它们(仅限其帐户),并插入/删除特定数据(在其帐户中)。

非常感谢!

2 个答案:

答案 0 :(得分:0)

credit_card_brands表。 PRIMARY KEY(cc_id)。它不会有tenant_id。

表处理tenant_id和cc_id之间的多对多关系。每个新租户(我假设)都会以典型列表的默认值开头。租户可以通过您拥有的某些API删除不需要的关系。

所以,再次,这是另一个包含tenant_id的表(以及PRIMARY KEY的一部分)。每个租户都有多行。

Advice on structure of many-to-many table

答案 1 :(得分:0)

您有两套信用卡:

  1. "默认"一套所有信用卡
  2. 特定租户接受的信用卡套件
  3. 还有第三个,

    1. 特定租户不接受的信用卡套件
    2. 您可以派生shape (251328, )#3 = #1 - #2。为方便起见,第二种选择似乎更可取,因为它是一个较短的维护列表,随着新卡上线,它们自动成为#2的一部分。

      现在我们可以想象一个观点:

      #2 = #1 - #3

      你也可以使用select * from cards EXCEPT select ... from unacceptable where tenant_id = @tenant_id 来达到同样的效果。

      HTH。