1

我为不久前经营飞盘联盟的当地团体构建了一个应用程序。我想把它建立起来,让它成为我可以提供给其他团体的东西。

Jist:人们注册参加比赛,应用程序创建团队,应用程序创建时间表,每个组都有管理员可以管理他们的联赛

问题是,我有一个数据库,它最初设置为只处理一个组的联赛。我将如何重新设计架构以允许多个组能够登录并仅修改他们自己的联赛。

我的想法是创建一个“帐户”表,并将“account_id”添加到每个表。这是一个好方法吗?我已经附上了模式,所以你应该能够看到我到目前为止所拥有的!

注意:我在 Codeigniter (php) 和 MySQL 中构建它。

在此处输入图像描述

4

1 回答 1

5

多个客户;一个托管应用程序。您正在描述一个多租户数据库。

构建多租户数据库时,需要考虑

  • 查询
  • 成本
  • 数据隔离和保护
  • 维护,和
  • 灾难恢复。

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

“无共享”、“独立数据库”或每个租户一个数据库

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

“共享一切”,或“共享模式”,或“每个星球一个数据库”

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

在“无共享”和“共享一切”之间是“共享模式”。

“共享架构”

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

Microsoft 有一篇关于多租户架构的好文章,其中包含更多详细信息。(该链接仅指向多页文档的一页。)

于 2012-04-09T02:19:36.533 回答