Database design SaaS数据库设计-多个数据库?分裂

Database design SaaS数据库设计-多个数据库?分裂,database-design,architecture,database-schema,multi-tenant,saas,Database Design,Architecture,Database Schema,Multi Tenant,Saas,我见过SaaS应用程序以多种不同的方式托管。跨多个数据库拆分功能和模块是一个好主意吗?例如,将用户表放在一个数据库中,将功能/应用程序特定的表放在另一个数据库中,或者将其他共享表放在另一个数据库中?问问自己:将所有内容移动到单独的数据库中会获得什么 我猜在管理方面会有很多痛苦。我个人更希望将所有内容都放在一个数据库中,如果以后遇到一个数据库无法解决的问题,请将数据迁移到多个数据库中。拥有一个数据库最有利于数据完整性,因为这样您就可以使用外键。如果将数据拆分为多个数据库,则无法实现这种内置数据完整

我见过SaaS应用程序以多种不同的方式托管。跨多个数据库拆分功能和模块是一个好主意吗?例如,将用户表放在一个数据库中,将功能/应用程序特定的表放在另一个数据库中,或者将其他共享表放在另一个数据库中?

问问自己:将所有内容移动到单独的数据库中会获得什么


我猜在管理方面会有很多痛苦。我个人更希望将所有内容都放在一个数据库中,如果以后遇到一个数据库无法解决的问题,请将数据迁移到多个数据库中。

拥有一个数据库最有利于数据完整性,因为这样您就可以使用外键。如果将数据拆分为多个数据库,则无法实现这种内置数据完整性。如果数据不相关,则这不是问题,但如果数据相关,则一个数据库可能包含与另一个数据库不一致的数据。在这种情况下,您需要编写一些代码,定期扫描数据库中不一致的数据,以便能够适当地处理它


但是,如果您需要站点/应用程序具有高度可扩展性(例如,internet规模),则可能需要多个数据库。例如,您可以将每个数据库托管在不同的物理服务器上。

按功能拆分数据库可能不是一个好主意,除非您看到强有力的证据表明需要这样做。通常,您可能需要将两个数据库作为单个事务的一部分进行更新,而分布式事务更难处理。此外,如果需要拆分数据库,您可以使用分片。

是扩展SaaS应用程序的好博客。如前所述,按照您的建议跨数据库拆分表通常是个坏主意。但一个类似的概念是分片,即保持相同(或类似)的模式,但在多个服务器上分割数据。例如,用户1-5000在服务器1上,用户5000-10000在服务器2上。根据应用程序使用的查询,它是一种有效的扩展方式。

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


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

从一个数据库开始。在项目需要时拆分数据/功能

以下是我们可以从LinkedIn中学到的:

  • 单个数据库不起作用
  • 引用完整性将不可能
  • 任何数据丢失都是一个问题
  • 缓存是好的,即使它是适度有效的
  • 永远不要低估增长轨迹
资料来源:


保持自然设计(根据需要进行反规范化,根据需要减少规范化)。将数据库模型拆分为其模块,并通过使用服务(拥有数据)前置数据,牢记面向服务的原则

实现这一点的方法多种多样,但多租户的问题不仅仅是数据模型。我不喜欢插拔产品,但我的同事告诉我,.我们是一个云操作系统,允许您编写单租户SOA应用程序(可以随意使用NHibernate进行数据访问),自动将多租户注入到您的应用程序中。当您发布应用程序时,您可以选择数据模型(独立数据库或共享),SaaSGrid将相应地部署,并且您的应用程序将在不更改任何代码的情况下运行—只需编写代码,就像编写单个租户的代码一样

为什么要使用数据库

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


我认为db适合于敏感的数据,如资金运营,但对于其他一切,您都可以使用分布式存储。

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

下一个讨论将包括许多开发人员的反馈,他们已经在那里完成了这项工作。一般的共识是,如果可以,请避免使用多个数据库,并自动执行仅租户查询。SQLAzure提供了行级安全性来帮助实现这一点。它也可以在应用程序级别完成


最后一个想法。。在开始时选择单个数据库,并不排除您以后使用每个租户的数据库。您甚至可以稍后在一个数据库中支持许多较小的客户,而较大的或付费的客户拥有自己的数据库。但是,从每个租户的数据库开始,意味着如果您以后切换回每个数据库的多个租户,您将面临巨大的迁移成本。

大多数saas应用程序的可能重复项都是1 db,范围由用户id或帐户id决定。那么,如果我们将所有数据保留在一个位置,数据库大小如何?我相信我们有一些限制。