SaaS数据库设计-多个数据库?拆分?

20

我见过很多不同方式托管SaaS应用程序。将功能和模块分散到多个数据库中是否是一个好主意?例如,将用户表等内容放在一个DB上,将特定于功能/应用程序的表放在另一个DB上,而其他常见共享表则放在另一个DB上。


10个回答

34

从一个数据库开始,只有当项目需要时才拆分数据/功能。

以下是我们可以从LinkedIn中学到的经验教训:

  • 单个数据库不够用
  • 引用完整性将无法实现
  • 任何数据丢失都是一个问题
  • 即使缓存效果适度,缓存仍然是好的
  • 永远不要低估增长轨迹

来源:

LinkedIn架构

LinkedIn通信架构


13

High Scalability 是一篇关于扩展SaaS应用的好博客。正如提到的,按照您建议的方式将表拆分到多个数据库中通常不是一个好主意。但是一个类似的概念是分片(sharding),它可以在多台服务器上保留相同(或相似)的模式,但将数据分为多个部分。例如,用户1-5000位于server1上,而用户5000-10000位于server2上。根据应用程序使用的查询,这可以是一种有效的扩展方式。


9

对于SaaS应用程序,您为多个租户使用多个数据库,但通常不按模块拆分。

这是我在SaaS应用程序设计中看到的最常见的模型。您的基础架构将为您添加的每个租户复制一次。


大多数SaaS应用程序都是通过user_id或account_id进行1个数据库范围的。 - im_brian_d

4
拥有一个单一的数据库对于数据完整性来说是最好的,因为这样你可以使用外键。如果将数据拆分到多个数据库中,就无法拥有内置的数据完整性。如果你的数据没有关联性,那么这不是问题,但如果有关联性,你的一个数据库可能包含与另一个数据库不一致的数据。在这种情况下,你需要编写一些代码,定期扫描你的数据库以查找不一致的数据,以便适当地处理它们。
然而,如果你需要使你的站点/应用程序具有高度可扩展性(例如互联网规模),则可能需要多个数据库。例如,你可以在不同的物理服务器上托管每个数据库。

如果我们将所有数据保存在一个地方,那么数据库大小会怎样呢?我相信我们有某种限制。 - Basheer Kharoti

3
拆分数据库并不是一个好的想法,除非你看到了强烈的证据表明这样做是必要的。通常你可能需要在单个事务中更新两个数据库,而分布式事务会更加困难。此外,如果需要拆分数据库,你可以考虑采用数据分片技术。

2
请看Azure SQL的多租户SaaS数据库租户模式,其中详细列出了解决方案和决策标准的清单。

https://learn.microsoft.com/en-us/azure/azure-sql/database/saas-tenancy-app-design-patterns

这个讨论包含了很多已经有过相关经验的开发人员的反馈。总体共识是,如果可以的话应该避免使用多个数据库,并自动强制执行仅限于租户的查询。SQL Azure 提供了行级安全功能来协助实现此目标。也可以在应用程序层面上进行实现。

https://www.indiehackers.com/post/should-i-keep-only-one-database-for-each-customer-in-a-saas-product-2af0af42f4

最后一点思考...在开始时选择单个数据库,并不意味着您不能在以后转向每个租户一个数据库。您甚至可以在一个数据库中支持许多较小的客户,而拥有自己的数据库的大型或高级付费客户。但是,从每个租户一个数据库开始意味着如果您稍后要切换回每个数据库多个租户,则需要承担显著的迁移成本。

1
问问自己:将所有内容移动到单独的数据库中,你会得到什么好处?
我猜管理方面会带来很多痛苦。个人而言,我更愿意将所有内容放在一个数据库中,如果以后遇到无法通过单个数据库解决的问题,则将数据迁移到多个数据库中。

0

有多种方法可以实现它,但多租户的问题不仅仅涉及数据模型。我不想打广告,但请查看我所在公司ApprendaSaaSGrid。我们是一款云操作系统,允许您编写单租户SOA应用程序(可以使用NHibernate进行数据访问),自动将多租户注入到您的应用程序中。当您发布应用程序时,您可以选择数据模型(隔离数据库或共享数据库),SaaSGrid会相应地部署,您的应用程序将无需任何代码更改即可运行 - 只需像为单个租户编写代码一样!


0

为什么要使用数据库呢?

我认为使用分布式存储系统如Hadoop、Voldemort(由LinkedIn开发和使用的project-voldemort.com)是个好主意。

我认为数据库适用于敏感数据,如货币操作,但对于其他所有内容,您可以使用分布式存储。


0

保持自然的设计(尽可能去规范化,只在必要时进行规范化)。将数据库模型拆分为其模块,并通过使用服务来管理数据,牢记面向服务的原则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接