多个模式与巨大的表格

18
考虑一个移动设备管理系统,其中包含每个用户的信息,例如存储在手机上已安装应用程序的表、审计细节、通知信息等。 是否明智地为每个用户创建相应表的单独模式? 对于单个用户,表的数量很大,约为30个表。是将所有此信息放入这些表中的单独模式(从而创建巨大的表)更好,还是为每个用户创建一个模式?
提前感谢。

也许我没有完全理解这个问题,但为什么每个表中都不能有一个“UserID”? - Damir Sudarevic
是的,我可以,但我想看看哪种方法在查询数据库方面更有效。即是否添加userID,但因为有大量用户而导致表格变得很大,还是每个用户应该有一个单独的模式。 - michelle
1
我认为所有主要的系统(具有多用户模型的系统)都遵循Damir建议的方法(使用UserId)。“每个用户的架构”方法将无法扩展。想象一下,在数据库中有50个表,而10个用户尝试创建账户。在运行中的系统上,您将不得不创建500个表! - Rajesh Chamarthi
@RajeshChamarthi:我曾经处理过生产环境中有数万个表的系统。这对人员来说比对服务器本身更具挑战性。(如果你购买了一台真正好的服务器的话。) - Mike Sherrill 'Cat Recall'
1个回答

39
我想知道在数据库中查询哪种方法更有效率。在多租户数据库中,查询只是问题的一部分。其他部分包括成本、数据隔离与保护、维护和灾难恢复。这些都是非常重要的;你不能仅仅考虑多租户数据库的查询效率。
多租户解决方案从每个租户一个数据库(共享无)到每个租户一行记录(共享所有)不等。
"共享无"、"单独的数据库"或每个客户一个数据库
- 每个客户最昂贵。(大量客户意味着大量服务器。) - 最高程度的数据隔离。 - 单个租户的灾难恢复简单明了。 - 维护理论上更加困难,因为需要在每个数据库中进行更改。但是你的数据库管理系统可能容易支持在每个数据库中运行存储过程。(例如SQL Server有一个未记录的系统存储过程sp_msforeachdb。你可能自己编写。) - "共享无"也是最容易定制的,但这也会带来更多的维护问题。例如,每个租户可能有不同的使用模式,这表明每个租户可能需要其他租户不需要的某些索引。这对于"共享无"来说是微不足道的;但对于"共享所有"(下面)则是不可能的。 - 每个表中的最少行数。查询速度接近最优。
"共享所有"、"共享架构"或"每个星球一个数据库"
- 每个租户最便宜。 - 数据隔离程度最低。每个表都有一个标识哪个租户拥有该行的列。由于租户行混在每个表中,因此相对容易意外地暴露其他租户的数据。
  • 对于单租户的灾难恢复相对较为复杂;需要在许多表中恢复单个行。另一方面,单租户灾难相对不太常见。大多数灾难可能会影响所有租户。
  • 结构维护更简单,因为所有租户共享表格。但是它增加了通信负担,因为您必须与每个租户通信和协调每个更改。它不容易定制。
  • 每个表的行数最多。快速查询更困难,但这取决于租户的数量和行数。您可能很容易进入VLDB领域。
  • 在“没有共享”和“完全共享”之间是“共享架构”。

    “共享架构”

    • 租户共享一个数据库,但每个租户都有自己命名的架构。成本介于“没有共享”和“完全共享”之间;大型系统通常比“没有共享”需要更少的服务器,比“完全共享”需要更多的服务器。
    • 比“完全共享”更好的隔离性。不像“没有共享”那么隔离。(您可以在架构上授予和撤销权限。)
    • 单租户的灾难恢复需要恢复许多架构中的一个。这取决于您的数据库管理系统,可能相对容易或相当困难。
    • 维护比“没有共享”更容易;不像“完全共享”那么容易。编写一个在数据库中每个模式中执行的存储过程相对简单。与“没有共享”相比,更容易在租户之间共享公共表格。
    • 通常每台服务器上的活跃租户比“没有共享”多,这意味着它们共享(降级)更多的资源。但不像“完全共享”那么糟糕。

    微软有一篇关于多租户架构的好文章,其中提供了更多细节。(这个链接只是多页文档中的一页。微软已将该页面删除;现在的链接指向archive.org上的副本。)


    1
    共享无所谓是真实世界中最快的,因为你最终不得不使用更便宜的数据库服务器(或更有可能是虚拟机)。每个1千美元的数据库盒子一个客户端很可能比一个5千美元的数据库盒子上的5个客户端甚至是3千美元的数据库盒子上的5个客户端慢。 - derobert
    “Shared nothing”并不限制您只能使用1000美元的服务器。而“shared nothing”也不意味着每个租户一个计算机;它意味着每个租户一个数据库。您正确地暗示了愚蠢的硬件决策可能会瘫痪任何设计。但这是对不同问题的回答。 - Mike Sherrill 'Cat Recall'
    首先,你对于“共享无何”("shared nothing")的定义非常奇怪,其中磁盘和内存都是共享的。这也使得你的“共享无何”基本上与你的“共享模式”(我猜你实际上是指分离的模式)相同。 [SQL Server在备份/恢复模式方面存在一些奇怪之处,但其他常见的数据库则没有] 而“每个租户一台计算机”的设计可能很蠢,它确实有明显的优点(例如,一个客户产生大量负载不会影响任何其他人)。 - derobert
    2
    在多租户数据库架构中,“共享无”并不意味着与分布式计算架构中的“共享无”相同。它与共享模式不同,无论您选择哪种含义。“共享模式”可以意味着:1)每个租户一个模式(每个数据库有多个租户,每个租户都有自己的模式和因此自己的表),或2)所有租户共享每个表(每个数据库有多个租户,在一个模式中的所有租户,对于这一点我更喜欢使用“共享一切”的术语)。多租户数据库架构独立于硬件和网络架构。 - Mike Sherrill 'Cat Recall'

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接