多租户PHP SaaS - 为每个客户端分离数据库,还是将它们分组?

时间:2012-11-10 19:33:31

标签: php mysql saas multi-tenant

你可能不得不忍受我在这里因为我甚至没有意识到这一点属于整个“多租户”软件作为服务类别,但是在这里确实

我为客户开发了一个会员系统(用PHP)。我们现在正在考虑将其作为完全托管的解决方案提供给我们的其他客户,提供子域(甚至是他们自己的域)。

就数据存储而言,我似乎在桌面上的选项是:

选项1 - 将所有内容存储在一个大型数据库中,并在需要它的表上有一个“client_id”字段(将会有大约30个表适用),并且'客户'表存储他们的主要设置,详细信息等以及要映射到他们的域。然后,这只是设置一个包含其各自客户端ID的全局可访问变量 - 我显然必须修改每个查询以检查client_id列。

选项2 - 拥有一个包含“共享参考”表和“客户”表的主表。然后拥有其他数据库的“块”,每个数据库包含10个客户端。客户端将获得自己的数据库表,前缀为其客户端ID。这增加了一点安全性,以防止在出现问题时看到其他客户端数据。

选项3 - 与选项2完全相同,只是每个客户端都有1个数据库,完全将它们与其他客户端隔离,理论上提供了更多的保护,如果1个客户端的表被黑客入侵或以其他方式受损,不会影响其他任何人。最大的缺点是,在部署新客户端时,整个数据库,用户和密码需要设置等等。这可能还会导致相当大的开销,或者它是否几乎与每个人都在一个数据库?

还有几点 - 其中一些客户将拥有5000多个'客户'以及这些客户的所有细节 - 这就是为什么选项1可能有点问题 - 如果我有100个客户,这可能相当于1个表中超过50万行。

我认为选项3是客户数据(和支付信息)安全性至关重要的最佳方式。根据我的建议,有些人说选择1是因为“它更容易”,但我真的不这么认为。我认为这是潜在的瓶颈,因为如果他们有自己的数据库,我肯定可以更容易地移动客户。

(仅供参考,系统是基于MySQL的PHP​​)

3 个答案:

答案 0 :(得分:13)

选项3是最具扩展性的。虽然起初可能看起来更复杂,但它可以完全自动化,并且可以避免您对未来的头痛。您还可以通过在多个服务器上安装客户端数据库来提高性能,从而提高性能。

答案 1 :(得分:2)

我同意Ozzy - 我这是为在线数据库产品做的。我们有一个主数据库,基本上有一个美化的用户表。每个客户都有自己的数据库。这样做的好处是我可以轻松地将一个客户数据库从服务器A移动到服务器B [mysql],并且可以通过命令行工具轻松实现。还要对大型表进行维护,删除/添加索引可能会搞砸你的应用程序,特别是如果说,添加索引会锁定表[mysql]。它会影响每个人。据推测,使用较小的数据库,当您需要推出模式级别更改时,您可以更好地避免这种情况并拥有更多选项。我只是喜欢灵活性。

答案 2 :(得分:1)

多年前我设计了Innomatic,用于在PHP中构建SaaS应用程序的开源平台,我选择了第三种选择:多租户代码单租户数据库

根据我的经验,这是最具扩展性的选项,但它还需要一组脚本来在更新代码,数据库方案,启用应用程序到租户等时传播更改。

因此,我付出了很多努力来构建基于组件的可扩展引擎,以完全自动化所有这些任务并最大限度地减少系统管理工作。如果你想采用第三种选择,我强烈建议建立这样的架构。