多租户 PHP SaaS - 为每个客户端单独设置数据库,还是对它们进行分组?
你必须忍受我在这里可能会得到一些稍微错误的术语,因为我甚至不知道这属于整个“多租户”“软件即服务”类别,但在这里它确实如此。
我为客户开发了一个会员系统(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)