需要更新我的单用户app数据库以允许多个用户,如何修改数据库架构?

时间:2012-04-08 18:05:35

标签: php mysql database database-design

我为不久前经营飞盘联盟的本地团队构建了一个应用程序。我想要构建它,并使其成为我可以提供给其他组的东西。

Jist:人们注册游戏,app创建团队,app创建日程表,每个团队都有管理员可以管理他们的联赛

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

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

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

enter image description here

1 个答案:

答案 0 :(得分:5)

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

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

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

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

“无共享”,“单独数据库”或每个租户一个数据库

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

“共享所有内容”,或“共享架构”,或“每个星球上的一个数据库”

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

“无共享”和“共享所有内容”之间是“共享模式”。

“共享架构”

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

微软在multi-tenant architecture上发表了一篇很好的文章,详细介绍了这些文章。 (该链接仅适用于多页文档的一页。)

相关问题