【发布时间】:2012-10-30 19:04:21
【问题描述】:
您必须忍受我在这里可能会弄错一些术语,因为我什至不知道这属于整个“多租户”“软件即服务”类别,但在这里会的。
我为客户开发了一个会员系统(用 PHP 编写)。我们现在正在考虑将其作为完全托管的解决方案提供给我们的其他客户,提供子域(甚至是他们自己的域)。
就数据存储而言,我似乎有以下选择:
选项 1 - 将所有内容存储在 1 个大数据库中,并在需要它的表上有一个“client_id”字段(大约有 30 个表适用),并有一个'clients' 表存储他们的主要设置、详细信息等以及映射到它们的域。然后,这只是设置了一个包含其各自客户端 ID 的全局可访问变量 - 我显然必须修改每个查询以检查 client_id 列。
选项 2 - 有一个包含“共享参考”表和“客户”表的主表。然后有其他数据库的“块”,每个数据库都包含 10 个客户端。客户将获得他们自己的数据库表,并以他们的客户 ID 为前缀。这增加了一点安全性,以防止在出现问题时看到其他客户端数据。
选项 3 - 与选项 2 完全相同,除了每个客户端都有 1 个数据库,将它们与其他客户端完全隔离,理论上提供比 1 个客户端的表更多的保护被黑客入侵或以其他方式损坏,它不会影响其他任何人。最大的缺点是,在部署新客户端时,需要设置整个数据库、用户和密码等。这是否也可能会导致相当大的开销,或者就像你让所有人合二为一一样数据库?
还有几点 - 其中一些客户将拥有 5000 多个“客户”以及这些客户的所有详细信息 - 这就是为什么选项 1 可能有点问题 - 如果我有 100 个客户,这可能等于 1 个表中超过 50 万行。
在客户数据(和支付信息)的安全性是关键的情况下,我认为选项 3 是最佳方式,这是否正确。根据我的建议,有些人说选择选项 1,因为“它更容易”,但我真的不这么认为。我认为这是一个潜在的瓶颈,因为如果他们有自己的数据库,我肯定可以更轻松地移动客户。
(仅供参考,系统是基于 PHP 和 MySQL)
【问题讨论】:
标签: php mysql saas multi-tenant