是否有更简洁的方法来实现具有以下要求的多租户数据库?

时间:2012-05-17 06:14:21

标签: sql database-design multi-tenant

我一直在与Salesforce.com合作多年,为了进行心理锻炼/挑战,我试图为他们处理“数据库”提供类似的解决方案(是的我知道他们并不是真的使用表和视图,但元数据)。事实证明,这比首次预期更具挑战性。

请记住,我不是要重新发明SFDC。我只是想探索多租户实现的解决方案。

要求

  1. 必须能够处理多个客户/租户,而无需向其他客户公开客户特定数据,也无需使用客户特定数据库。
  2. 所有客户必须具有对一组标准表的标准化访问权(即,从帐户中选择*返回与请求客户关联的所有帐户)
  3. 所有客户必须能够向所有标准表添加自定义字段。
  4. 所有客户都必须能够添加自定义表格。
  5. 任何客户的自定义字段必须仅对该客户可见,即使“已添加”到标准表格中。
  6. 任何客户的自定义表必须仅对该客户可见。
  7. 理想情况下,此解决方案不会特定于一个RDBMS。 (不能依赖PostgreSQL的search_path)
  8. 我的解决方案

    1. 创建多模式数据库设计,其中标准表存储在“主要”模式(Primary.TrueAccounts)中。
    2. 为每个客户创建一个包含基表的单独模式,以保存FK将它们链接回Primary.TrueAccountsCust1.AccountCustomFields)。此表是添加任何自定义字段的位置。
    3. 客户的自定义表格只会添加到其架构中。
    4. 对于每个标准表,在客户架构中创建一个视图,将标准列与该客户的自定义列(CREATE VIEW Cust1.Accounts AS SELECT t1.field1, t1.field2, t2.* FROM Primary.TrueAccounts AS t1 LEFT JOIN Cust1.AccountCustomFields AS t2 ON t1.id = tw.Accountid WHERE t1.CustomerId = 1
    5. 连接起来

      我已经在MySQL工作台中嘲笑了这个基本的解决方案,所以我知道它至少是可能的,如上所述。

      我的最终问题是“我是怎么做到的?”。是否有更好/标准/更少丑陋/更有效的方式来实现上述要求?

0 个答案:

没有答案