SaaS 数据库设计 - 多个数据库?分裂?
-
09-06-2019 - |
题
我见过以多种不同方式托管的 SaaS 应用程序。将功能和模块拆分到多个数据库是一个好主意吗?例如,将用户表等内容放在一个数据库上,将功能/应用程序特定表放在另一个数据库上,也许将其他常用共享表放在另一个数据库上?
解决方案
从一个数据库开始。当项目需要时拆分数据/功能。
以下是我们可以从 LinkedIn 学到的东西:
- 单一数据库不行
- 引用完整性将不可能实现
- 任何数据丢失都是一个问题
- 缓存虽然效率不高,但还是很好的
- 永远不要低估增长轨迹
来源:
其他提示
高扩展性 是一个关于扩展 SaaS 应用程序的好博客。如前所述,按照您的建议跨数据库拆分表通常是一个坏主意。但类似的概念是分片,即保留相同(或相似)的模式,但将数据拆分到多个服务器上。例如,用户 1-5000 在 server1 上,用户 5000-10000 在 server2 上。根据您的应用程序使用的查询,它可能是一种有效的扩展方式。
对于 SaaS 应用程序,您可以为多个租户使用多个数据库,但通常不会按模块进行拆分。
这是我在 SaaS 应用程序设计中见过的最常见的模型。您的基本架构会为您添加到应用程序的每个租户进行复制。
拥有单个数据库最有利于数据完整性,因为这样您就可以使用外键。如果将数据拆分到多个数据库中,则无法获得这种内置数据完整性。如果您的数据不相关,这不是问题,但如果相关,您的一个数据库可能包含与另一数据库不一致的数据。在这种情况下,您需要编写一些代码来定期扫描数据库以查找不一致的数据,以便您可以适当地处理它。
但是,如果您需要站点/应用程序具有高度可扩展性(例如,互联网规模)。例如,您可以将每个数据库托管在不同的物理服务器上。
按功能拆分数据库可能不是一个好主意,除非您看到强有力的证据表明有必要。通常,您可能需要更新两个数据库作为单个事务的一部分 - 而分布式事务则更难使用。此外,如果数据库需要拆分,您也许可以采用分片。
为什么要使用数据库?
我认为使用 Hadoop、Voldemort(由 LinkedIn 开发和使用的项目-voldemort.com)等分布式存储系统是个好主意。
我认为 db 对于金钱操作等敏感数据很有用,但对于其他一切,你可以使用分布式存储。
问你自己:将所有内容移至单独的数据库中可以获得什么?
我猜管理方面会有很多痛苦。我个人更愿意将所有内容都放在一个数据库中,如果稍后遇到单个数据库无法解决的问题,则将数据迁移到多个数据库中。
保持自然的设计(根据需要尽可能多地反规范化,根据需要尽可能少地规范化)。将数据库模型拆分为多个模块,并通过将数据置于服务(拥有数据)的前面,牢记面向服务的原则。