(我不确定这是否是发布此问题的最佳地点。如果不是,请将我重定向到适当的堆栈交换站点。)
我希望为多个客户端部署 Web 应用程序。这个想法是每个客户端只能访问他或她自己的数据。假设客户端是应用程序安装的所有者。每个安装可以有多个用户。所有安装都将在我自己的主机上,这样我就可以更好地控制代码和业务模型(它是一种 SaaS 的东西)。
我正在寻找执行此类部署的技术选项。
[选项 1] - 共享单一数据库
这样做的简单选择是:
- 更改数据库以使每个相关表知道其“所有者 ID”。
- 更改所有 SQL 查询,以便每个用户只会获取与其“所有者 ID”相关的数据(我不要求一个用户对多个客户端/安装是通用的)。
但是,此解决方案有一些缺点:
- 需要更改大部分 SQL 代码;
- 可能会对性能产生一些影响,因为数据库将包含更多数据(所有安装的数据)。
- 在同一个数据库中混合不同客户端的数据可能会导致一些问题(如果存在错误,则更容易让某人最终访问其他人的数据);
因此,我更喜欢将数据隔离的替代方案。
[选项 2] - 多个数据库
我正在考虑的一种选择是:
- 对于每次安装,从托管公司购买一个数据库
- 想出一个配置方案,允许将每个安装与应该执行连接的数据库相关联。
- 例如,如果用户访问http://very-nice-app.com/client-3/,代码知道它必须连接到 database-name-for-client-3。
这解决了数据泄漏的潜在问题,但需要我维护多个数据库(如果数据库表发生变化,则必须跨多个安装来完成)。这可能可以以某种方式自动化。
[问题]
什么是更好的方法?有没有比我提到的更好的选择?
在此先感谢您的帮助。
[附加信息]
- 数据库引擎可能是 MySQL。
- 这是一家初创公司,所以我们正在尝试商业模式。我们不知道我们将拥有多少客户 - 一段时间内它将为零。现在我们正在寻找为少数客户(比如说最多 10 个)部署和扩展的能力。
- 此应用程序针对小型企业,数据量不应在数百万条记录中。最大的表每年(每个客户)应该有大约 10.000 条记录。该值基于与我们一起制作原型的公司(这是一家从事 x 业务领域的中型公司)。
这是没有一个正确答案的古老“如何处理多租户”问题。您已经很好地选择了要点。除了“视情况而定”之外,我无法提供答案,但这里还有其他几点供您考虑:
mixing data of different clients ... if there is a bug, its easier for someone to end up accessing some else's data
并且Come up with a scheme associating each installation [correct] database
- 如果不同的数据库在同一主机上或可以被同一主机访问,这里的风险非常相似,特别是从防御蓄意攻击者的角度来看,因此部分决定归结为潜在安全的集合您认为可以最有效地围绕这些问题进行有效设计的问题。如果您觉得自己缺乏 SQL 技能,那么由于担心随着客户群的增长,大数据量会变得效率低下,这可能会促使您转向多数据库方向。For each installation, buy a DB from the hosting company
对于 SaaS 解决方案,如果您按数据库或类似方式付费,则托管安排不当。这听起来像是传统的共享网络托管,您应该查看专用机器(虚拟或物理)或基于 PaaS 的平台。仔细考虑您打算如何扩展应用程序。多数据库选项让您可以随着需求的增长在数据库服务器之间自由拆分客户端,但如果设计合适,单一数据库选项在 PaaS 环境中更容易管理,让平台提供商担心扩展的物理现实您为更多资源付费。
同样在可伸缩性问题上,请务必考虑您的管理职责:您将如何备份数据、在出现错误/事故时如何恢复部分数据,或者在发生应用程序/平台范围的灾难时如何恢复所有数据,以及什么在此类事件中,您希望/需要按照时间表工作吗?
有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/aa479086.aspx、https://en.wikipedia.org/wiki/Multitenancy,并搜索类似术语以进行进一步讨论。(第一个链接来自 MS,但从一般设计的角度涵盖了这个问题,而不是特定于 MS SQL Server,它也已经存在了一段时间,但相关问题并没有像你想象的那样改变在过去十年中)