我见过很多不同方式托管SaaS应用程序。将功能和模块分散到多个数据库中是否是一个好主意?例如,将用户表等内容放在一个DB上,将特定于功能/应用程序的表放在另一个DB上,而其他常见共享表则放在另一个DB上。
我见过很多不同方式托管SaaS应用程序。将功能和模块分散到多个数据库中是否是一个好主意?例如,将用户表等内容放在一个DB上,将特定于功能/应用程序的表放在另一个DB上,而其他常见共享表则放在另一个DB上。
从一个数据库开始,只有当项目需要时才拆分数据/功能。
以下是我们可以从LinkedIn中学到的经验教训:
来源:
High Scalability 是一篇关于扩展SaaS应用的好博客。正如提到的,按照您建议的方式将表拆分到多个数据库中通常不是一个好主意。但是一个类似的概念是分片(sharding),它可以在多台服务器上保留相同(或相似)的模式,但将数据分为多个部分。例如,用户1-5000位于server1上,而用户5000-10000位于server2上。根据应用程序使用的查询,这可以是一种有效的扩展方式。
对于SaaS应用程序,您为多个租户使用多个数据库,但通常不按模块拆分。
这是我在SaaS应用程序设计中看到的最常见的模型。您的基础架构将为您添加的每个租户复制一次。
https://learn.microsoft.com/en-us/azure/azure-sql/database/saas-tenancy-app-design-patterns
这个讨论包含了很多已经有过相关经验的开发人员的反馈。总体共识是,如果可以的话应该避免使用多个数据库,并自动强制执行仅限于租户的查询。SQL Azure 提供了行级安全功能来协助实现此目标。也可以在应用程序层面上进行实现。 最后一点思考...在开始时选择单个数据库,并不意味着您不能在以后转向每个租户一个数据库。您甚至可以在一个数据库中支持许多较小的客户,而拥有自己的数据库的大型或高级付费客户。但是,从每个租户一个数据库开始意味着如果您稍后要切换回每个数据库多个租户,则需要承担显著的迁移成本。为什么要使用数据库呢?
我认为使用分布式存储系统如Hadoop、Voldemort(由LinkedIn开发和使用的project-voldemort.com)是个好主意。
我认为数据库适用于敏感数据,如货币操作,但对于其他所有内容,您可以使用分布式存储。
保持自然的设计(尽可能去规范化,只在必要时进行规范化)。将数据库模型拆分为其模块,并通过使用服务来管理数据,牢记面向服务的原则。