【问题标题】:Multi tenancy design - sharing data between schemas多租户设计 - 在模式之间共享数据
【发布时间】:2018-08-27 08:33:47
【问题描述】:

让我们考虑这种情况:

  1. 用户可以拥有一家公司(或多家)
  2. 用户可以是公司的一部分(或许多公司)
  3. 公司是系统的单一租户
  4. 公司有一个任务列表
  5. 每个任务都分配给一个用户

现在考虑到上述情况,我想实现一个系统,其中每个公司(租户)都有一个单独的架构来完成其任务,但问题是对于每个任务,我还需要来自主架构的用户数据。

问题是如何解决这个问题

我想到的可能的解决方案(但没有一个真正让我信服):

  1. 将与公司匹配的所有用户数据复制到公司的架构中(这需要大量同步,因此我认为效率不高)
  2. 在模式之间切换并以编程方式“合并”它们 - 这涉及到许多额外的代码来实现,它违反了良好的做法 - 因为任务中的 user_id 会到达 tanant 的模式之外)

我希望有一个我没有想到的更好的解决方案。请注意,这是一个简化的案例,只是为了描述问题。

【问题讨论】:

  • 或者3,不要使用模式来分隔租户数据。
  • 我认为这也不好。随着越来越多的用户和公司(和任务),搜索任务以查询属于给定公司的任务将是无效的。
  • 索引...使用它们。只要您有适当的设计和索引,数据库就非常擅长查找数据。或者执行您的两个建议之一,这将是维护和性能的噩梦。
  • 是的,但是在一个模式和单独的模式之间仍然存在巨大的计算差异。维护是我真的想避免这两种解决方案的另一个原因,如果没有其他方法出现,那么一种模式就是要走的路。
  • 就数据库而言,仅在架构上有所不同的两个相同表是两个不同的表。您将构建自定义 UNION 查询以获得您想要的结果,因此告别计划缓存。每个客户的架构很快就会变得无法维护。

标签: sql database multi-tenant


【解决方案1】:

听起来您想要一些表,例如 userscompaniestasks 和相关表。

通常,您不希望将实体拆分到多个表中。以下是一些原因。

  1. 维护几张表比维护成百上千张表更容易。
  2. 数据库在更大的表上效率更高。小表的激增会导致单个实体出现大量部分填充的数据页。
  3. 使用单个表可以更轻松地完成某些查询(例如每个公司有多少任务)。
  4. 对于多个表,此类查询通常需要使用动态 SQL,这对于简单的任务来说是一团糟。
  5. 当您必须将重组应用到无数个表而不是少数几个表时,重组数据将成为一场噩梦。
  6. 必须多次重复添加新功能是一场噩梦。

在极少数情况下,分离数据是有意义的。例如,如果应用程序要在每家公司进行本地部署,那么您别无选择。同样,您可能有保持数据物理分离的法律要求。但从严格的数据库设计角度来看,您希望每个实体一个表。

【讨论】:

  • 我认为反对者不同意这些观点。她/他应该在评论中说明原因。
  • 谢谢,您已经阐明了为什么实际上拥有一个架构会更好。
猜你喜欢
  • 2019-05-18
  • 2014-01-16
  • 2014-03-21
  • 2012-12-14
  • 2017-03-21
  • 2013-05-05
  • 2016-05-10
  • 2012-01-30
  • 2016-07-01
相关资源
最近更新 更多