【问题标题】:Multi tenant shared data and exclude specific default data by tenant多租户共享数据并按租户排除特定默认数据
【发布时间】:2016-07-12 21:25:43
【问题描述】:

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

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

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

所以,我有桌子:

  • 租户
  • credit_card_brands

我提出的可能解决方案

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

我担心的是会因为重复数据而逃跑,并且易于维护。示例:如果我必须为所有租户添加一个新的默认值,我只插入一个表。

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

非常感谢!

【问题讨论】:

  • 这很容易,但现在模式太模糊了。因此,一个人所能做的就是高谈阔论,这有多大帮助?

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


【解决方案1】:

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.

【讨论】:

    【解决方案2】:

    您有两套信用卡:

    1. 所有信用卡的“默认”集合
    2. 特定租户接受的一组信用卡

    还有第三个,

    1. 特定租户不接受的一组信用卡

    您可以派生#3 = #1 - #2#2 = #1 - #3。为方便起见,第二个选项似乎更可取,因为它需要维护的列表较短,并且随着新卡的上线,它们会自动成为 #2 的一部分。

    现在我们可以想象一个视图:

    select * from cards
    EXCEPT
    select ... from unacceptable
    where tenant_id = @tenant_id
    

    您也可以使用where not exists 达到同样的效果。

    HTH。

    【讨论】:

      猜你喜欢
      • 2014-03-21
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2012-12-14
      • 2014-01-16
      • 2022-01-23
      • 2011-10-06
      相关资源
      最近更新 更多