多租户的PHP SaaS——为每个客户单独创建数据库,还是将它们分组?

26

可能我错了一些术语,因为我甚至没有意识到这是整个“多租户”“软件即服务”类别的一部分。

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

就数据存储而言,我似乎有以下几种选择:

选择1 - 将所有内容存储在一个大型数据库中,并在需要时在表上拥有一个“client_id”字段(约有30个表需要应用它),并有一个“clients”表来存储其主要设置、细节等以及与之映射的域名。然后只需设置一个全局可访问的变量包含其各自的客户ID - 我显然必须修改每个查询以检查client_id列。

选择2 - 有一个带有“共享引用”表和“客户”表的主表。然后有其他数据库的“块”,每个块包含10个客户,客户将获得其自己的数据库表,前缀为其客户ID。如果出现问题,这会增加一点安全性,以保护看不到其他客户数据。

选择3 - 与选择2完全相同,只是为每个客户有一个数据库,完全隔离它们于其他客户,并在理论上提供更多的保护,如果1个客户的表被黑客入侵或受到破坏,则不会影响任何其他人。最大的缺点是,在部署新客户时,需要设置整个数据库、用户和密码等。这可能也会导致相当大的开销,或者是否与将所有人放在一个数据库中相同?

还有一些要点-其中一些客户将拥有5000多个“客户”,以及这些客户的所有详细信息-这就是为什么选择1可能有点问题-如果我有100个客户,那可能相当于在1个表中有超过500,000行。

如果客户数据(以及付款信息)的安全性非常重要,那么我认为选项3是最好的选择。根据我得到的建议,一些人建议选择选项1,因为“它更容易”,但我并不这样认为。我认为这可能会成为未来瓶颈,因为如果客户有自己的数据库,我肯定可以更轻松地将客户转移。

(FYI该系统基于PHP和MySQL)

3个回答

18

选项3是最具可扩展性的。虽然一开始可能会更复杂,但可以完全自动化,并且将在未来节省您的头痛。通过在多个服务器上拥有客户端数据库以提高性能,您还可以更有效地进行扩展。


1
谢谢Ozzy - 这也是我的想法。唯一的潜在缺点,虽然不是很大,就是将表更新推送到所有数据库。但是由于所有的数据库都将运行相同的表集合,具有完全相同的结构,理论上我认为可以编写一个简单的脚本来循环遍历所有的数据库细节,连接,运行更新查询,断开连接,然后移动到下一个数据库。 - Sk446

2
我同意Ozzy的观点——我曾为一家在线数据库产品做过这样的事情。我们有一个主数据库,基本上只有一个用户表。每个客户都有自己的数据库。这样做的好处是,我可以轻松地将一个客户的数据库从A服务器移动到B服务器 [mysql],在紧急情况下可以使用命令行工具。另外,在处理大表时进行维护,添加/删除索引可能会真正地破坏您的应用程序,特别是如果添加索引锁定表格 [mysql]。它会影响所有人。而对于较小的数据库来说,你更不容易受到这种影响,并且在需要推出架构级别的更改时,你有更多的选择。我喜欢这种灵活性。

1
多年前,我设计了一个用于在PHP中构建SaaS应用程序的平台,我选择了第三个选项:多租户代码单租户数据库。根据我的经验,这是最可扩展的选项之一,但是它也需要一组脚本来传播更改,更新代码、DB方案、将应用程序启用到租户等。因此,我花费了很多精力构建了一个基于组件的、可扩展的引擎,以完全自动化所有这些任务并最小化系统管理工作。如果您想采用第三个选项,我强烈建议构建这样的架构。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接