多租户 PHP SaaS - 为每个客户端单独设置数据库,还是对它们进行分组?

2022-08-30 16:44:31

你必须忍受我在这里可能会得到一些稍微错误的术语,因为我甚至不知道这属于整个“多租户”“软件即服务”类别,但在这里它确实如此。

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

就数据存储而言,我似乎有一些选项:

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

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

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

还有几点 - 其中一些客户端将拥有5000多个“客户”以及这些客户的所有详细信息 - 这就是为什么选项1可能有点问题的原因 - 如果我有100个客户端,则可能等于1个表中的50多万行。

我是否正确地认为,在客户数据(和支付信息)安全是关键的情况下,选项3将是最好的方法。根据我的建议,有些人说要选择选项1,因为“它更容易”,但我真的不这么认为。我认为这是一个潜在的瓶颈,因为如果客户有自己的数据库,我当然可以更容易地移动客户。

(仅供参考 该系统是基于PhP的MySQL)


答案 1

选项 3 是最具可扩展性的选项。虽然乍一看似乎更复杂,但它可以完全自动化,并为您节省未来的麻烦。通过在多个服务器上拥有客户端数据库来提高性能,还可以更有效地进行扩展。


答案 2

我同意Ozzy的观点 - 我为在线数据库产品做了这件事。我们有一个主数据库,基本上有一个美化的用户表。每个客户都有自己的数据库。这样做的好处是,我可以很容易地将一个客户数据库从服务器A移动到服务器B[mysql],并且可以在紧要关头使用命令行工具做到这一点。此外,对大型表进行维护,删除/添加索引确实会搞砸应用程序,特别是如果添加索引会锁定表[mysql]。它影响着每个人。使用较小的数据库,您可能对此更免疫,并且在需要推出架构级别更改时有更多的选择。我只是喜欢灵活性。


推荐