一尘不染

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

mysql

您可能需要在这里与我联系,以免使某些术语有些错误,因为我什至没有意识到它属于整个“多租户”“软件即服务”类别,但是在这里确实如此。

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

就数据存储而言,我似乎在表上拥有的选项是:

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

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

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

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

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

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


阅读 1121

收藏
2020-05-17

共1个答案

一尘不染

选项3具有最大的可扩展性。虽然乍一看似乎比较复杂,但是它可以完全自动化,并且可以免除您对未来的麻烦。您还可以通过将客户端数据库放在多个服务器上来提高性能,从而更有效地扩展规模。

2020-05-17