您必须忍受我在这里可能会弄错一些术语,因为我什至不知道这属于整个“多租户”“软件即服务”类别,但在这里确实如此。
我为客户开发了一个会员系统(用 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 的)