【问题标题】:Need suggestion for Multi-tenant database architecture?需要多租户数据库架构的建议吗?
【发布时间】:2013-12-20 12:48:17
【问题描述】:

我们正在使用 SaaS 模型中的 PHP 和 MySQL 开发项目,每个租户都可以选择使用我们的 Module Creator 和 Form Builder 为自己创建模块。

当他们动态创建新模块时,我们正在为特定租户创建新表。所以每个租户都有不同的架构。

我建议使用每个租户的每个数据库,但我的经理希望将所有租户保留在单个数据库中,因为我们的项目还在继续升级。

现在我的想法是为每个租户拥有 2 个数据库;一个是主数据库,它对所有租户都通用,下一个是辅助数据库,用于每个人的表创建。

【问题讨论】:

  • 如果每个人都有自己的桌子,我认为它不再是 SaaS。甚至不是正常形式...
  • 我可以理解,但这是我的情况,如何管理现有表上的自定义表和自定义字段,请指导我

标签: php mysql database database-design database-schema


【解决方案1】:

可以通过多种方式设计多租户应用

1) 单一数据库,单一代码库

使用单个数据库并将所有客户端数据存储在单个数据库中。您必须在所有表中添加“clientid”之类的字段,并修改所有 SQL 查询以选择正确的“clientid”。如果您已经有一个单租户应用程序,则需要对代码进行大量修改。

优点:易于管理数据库和更新;没有重复。 缺点:如果在 SQL 查询中遗漏了一个“clientid”,可能会导致另一个客户端出现问题。

2)多数据库,单一代码库

为每个客户创建一个单独的数据库。无需修改现有的单租户代码库。您只需修改配置文件以根据客户端选择数据库。

优点:代码库修改很少,容易保证客户端数据不混杂。 缺点:要管理多个数据库,因此在数据库架构更新的情况下,您必须更新每个数据库。

3)多数据库,多代码库

创建一个单独的数据库并为每个客户复制完整的代码。完全不需要修改。

优点:无需修改代码库,易于确保客户端数据不会混合,易于执行客户端特定的修改。 缺点:要管理多个数据库/代码,因此在数据库架构/代码更新的情况下,您必须为每个客户端手动更新。

所以现在您决定哪些选项最适合您的项目要求。

【讨论】:

  • 只是为了澄清语言 - 在选项 1 中,我认为它不仅仅是一个单一的代码库,而是一个使用客户端 ID 将记录分开保存在单个表中的单一模式。
【解决方案2】:

我会将您租户的数据分隔在单独的数据库中。这使得实现错误变得更加困难,因此一个租户可能会意外访问另一个租户的数据。据我所知,至少有一个国家(德国)存在数据隐私法案,要求在多租户系统中分离数据库模式。

对于迁移数据库,我建议使用 flywire 之类的模型(好吧,那不是 PHP,但这个概念很简单,可以毫不费力地在 PHP 中重新实现)

【讨论】:

  • 非常感谢,能否分享一些飞线型号的网址,对我很有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-12-10
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
相关资源
最近更新 更多