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

Sk4*_*446 20 php mysql saas multi-tenant

你不得不忍受我在这里可能会使一些术语略显错误,因为我甚至不知道这属于整个"多租户"软件作为服务'类别,但它确实如此.

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

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

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

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

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

还有几点 - 其中一些客户将拥有5000多个"客户"以及这些客户的所有细节 - 这就是为什么选项1可能有点问题 - 如果我有100个客户,那可能相同一张表中超过五十万行.

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

(仅供参考系统基于PHP的PHP系统)

Ozz*_*zzy 14

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