多租户PHP SaaS - 为每个客户分开数据库,或将它们分组?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

由于我甚至没有意识到这个问题属于整个“多租户”软件作为一个服务类别,所以你必须忍受我在这里可能会遇到的一些术语有些错误,但是它确实存在。

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

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

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

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

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

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

我认为选项3是在客户数据(和支付信息)的安全性至关重要的情况下最好的选择。根据我的建议,有几个人说选择1是因为'更容易',但我真的不这么认为。我认为这是一个潜在的瓶颈,因为如果他们拥有自己的数据库,我可以更容易地移动客户端。

提问于
用户回答回答于

选项3是最具扩展性的。虽然起初它可能看起来更复杂,它可以完全自动化,并且可以为你节省未来的麻烦。通过在多台服务器上安装客户端数据库以提高性能,你还可以更高效地扩展。

用户回答回答于

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

扫码关注云+社区