需要多租户数据库架构的建议吗?

时间:2013-12-20 12:48:17

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

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

优点:极少的代码库修改,易于确保客户端数据不会混杂。 缺点:要管理多个数据库,因此在数据库架构更新时,您必须更新每个数据库。

3)多个数据库,多个代码库

创建一个单独的数据库&复制每个客户端的完整代码。根本不需要修改。

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

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

答案 1 :(得分:0)

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

对于迁移数据库,我建议使用像flywire这样的模型(好吧,那不是PHP,但这个概念非常简单,可以在PHP中重新实现而不需要付出很大的努力)。