多个模式与巨大的表格

mic*_*lle 17 database database-design multi-tenant database-performance

考虑一个移动设备管理器系统,其中包含每个用户的信息,例如存储他已安装在手机上的应用程序的表,审核详细信息,通知信息等.为每个用户创建一个单独的模式以及相应的表是明智的吗?对于单个用户而言,表的数量很大,每个用户大约30个表.拥有一个单独的模式,将所有这些信息放入这些表(反过来创建庞大的表?)或为每个用户设置模式会更好吗?

提前致谢

Mik*_*ll' 31

我想看看哪种方法在数据库中查询更有效.

在多租户数据库中,查询只是问题的一部分.问题的其他部分是成本,数据隔离和保护,维护和灾难恢复.这些都很重要; 您不能考虑多租户数据库中的查询效率.

多租户解决方案的范围从每个租户一个数据库(无共享)到每个租户一行(共享所有内容).

"无共享","单独的数据库"或每个租户一个数据库

  • 每个客户最贵.(大量客户意味着大量服务器.)
  • 最高程度的数据隔离.
  • 单个租户的灾难恢复简单明了.
  • 维护在理论上更难,因为需要在每个数据库中进行更改.但是您的dbms可能很容易支持在每个数据库中运行存储过程.(SQL Server有一个未记录的系统存储过程,例如sp_msforeachdb.您可以自己编写.)"无共享"也是最容易定制的,但这也会引发更多的维护问题.
  • 每个表的最小行数.查询速度接近最佳.

"共享一切",或"共享架构",或"每个星球一个数据库"

  • 每个租户最便宜.
  • 最低程度的数据隔离.每个表都有一列,用于标识行所属的租户.由于租户行在每个表中混合,因此意外暴露其他租户的数据相对简单.
  • 单个租户的灾难恢复相对复杂; 您必须在许多表中恢复单个行.另一方面,单租户灾难相对不常见.大多数灾难可能会影响所有租户.
  • 考虑到所有租户共享表格,结构维护更简单.但是,它会增加通信负载,因为您必须与每个租户进行通信并协调每个更改.它不容易定制.
  • 每个表的最大行数.快速查询更难,但这取决于有多少租户和多少行.您可以轻松地进入VLDB领域.

在"无共享"和"共享一切"之间是"共享模式".

"共享架构"

  • 租户共享一个数据库,但每个租户都有自己的命名模式.成本介于"无共享"和"共享一切"之间; 大型系统通常比"无共享"需要更少的服务器,比"共享所有内容"更多的服务器.
  • 比"分享一切"更好的隔离.没有"无所谓"的隔离.(您可以对模式进行GRANT和REVOKE权限.)
  • 单个租户的灾难恢复需要恢复许多模式中的一个.这要么相对容易,要么相当困难,具体取决于你的dbms.
  • 维护比"无共享"更容易; 不像"分享一切"那么容易.编写将在数据库中的每个模式中执行的存储过程相对简单.在租户之间共享公共表比在"无共享"中更容易.
  • 通常每个服务器的活动租户比"无共享"更活跃,这意味着它们共享(降级)更多资源.但没有"分享一切"那么糟糕.

微软有一篇关于多租户架构的文章,内容更详细.(该链接仅适用于多页文档的一页.)

  • 多租户数据库架构中的“无共享”并不等同于分布式计算架构中的“无共享”。它与共享模式不同,无论您选择哪种含义。“共享模式”可能意味着--1) 每个租户一个模式(每个数据库有多个租户,每个租户都有自己的模式,因此有自己的表),或 2)所有租户共享每个表(每个数据库有多个租户,所有租户在一种模式,对此我更喜欢“共享一切”一词)。多租户数据库架构独立于硬件和网络架构。 (2认同)