关于体系结构:SaaS数据库设计-多个数据库? 分裂?

关于体系结构:SaaS数据库设计-多个数据库? 分裂?

SaaS database design - Multiple Databases? Split?

我已经看到以许多不同的方式托管SaaS应用程序。 在多个数据库之间拆分功能和模块是一个好主意吗? 例如,将诸如User表之类放在一个DB上,将特定于功能/应用程序的表放在另一个DB上,也许将其他常见的共享表放在另一个DB中?


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

这是我们可以从LinkedIn获得的知识:

  • 单个数据库不起作用
  • 参照完整性将无法实现
  • 任何数据丢失都是一个问题
  • 即使效果适中,缓存也不错
  • 永远不要低估增长轨迹

资源:

LinkedIn架构

LinkedIn通讯架构


高可伸缩性是用于扩展SaaS应用程序的好博客。如前所述,按照您的建议在数据库之间拆分表通常不是一个好主意。但是类似的概念是分片,即您保留相同(或相似)架构,但将数据拆分到多个服务器上。例如,用户1-5000在服务器1上,用户5000-10000在服务器2上。根据您的应用程序使用的查询,这可能是一种有效的扩展方式。


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

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


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

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


除非您看到有力的证据表明有必要,否则按功能拆分数据库可能不是一个好主意。通常,您可能需要在单个事务中更新两个数据库-分布式事务更难处理。此外,如果需要拆分数据库,则可以使用分片。


为什么要使用数据库?

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

我认为db适用于诸如money操作之类的敏感数据,但是对于其他所有内容,您都可以使用分布式存储。


有多种方法可以实现它,但是多租户问题比数据模型更深。我不喜欢插入产品,但是请到我所在的公司Apprenda来查看SaaSGrid。我们是一个云操作系统,允许您编写单个租户SOA应用程序(随意使用NHibernate进行数据访问)并自动注入多租户进入您的应用。发布应用程序时,您可以执行诸如选择数据模型(隔离数据库或共享数据库)之类的操作,并且SaaSGrid将进行相应部署,并且您的应用程序将运行而无需任何代码更改-就像编写单个租户一样编写代码!


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

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


保持其自然的设计(根据需要尽可能多地进行规格化,而根据需要减少规格化)。将数据库模型分成其模块,并通过在数据前面拥有服务(拥有数据)来牢记面向服务的原则。


推荐阅读

    linux恢复数据库命令?

    linux恢复数据库命令?,工具,系统,软件,数据,盘中,密码,命令,备份,数据库,文

    linux命令大全数据库?

    linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,

    linux上数据库的命令?

    linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,

    linux命令dm数据库?

    linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,lin

    linux数据库查找命令?

    linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,

    linux数据库同步命令?

    linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,D

    linux建立数据库命令?

    linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服

    linux命令进数据库?

    linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,

    linux数据库检查命令?

    linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,

    linux命令进去数据库?

    linux命令进去数据库?,地址,服务,名字,系统,数据库,工具,基础,工作,管理,网

    linux数据库基础命令?

    linux数据库基础命令?,地址,工作,基础,系统,命令,信息,情况,工具,设备,目录,l

    数据库导出命令linux?

    数据库导出命令linux?,数据,系统,名称,密码,软件,服务,情况,网上,工具,文件,L

    linux数据库删除命令?

    linux数据库删除命令?,软件,服务,产品,名称,系统,不了,地址,管理,电脑,命令,L

    linux数据库操作命令?

    linux数据库操作命令?,信息,系统,网络,地址,分析师,数据,名称,管理,基础,命

    linux连数据库命令?

    linux连数据库命令?,服务,地址,密码,名字,系统,软件,一致,命令,数据库,读法,

    linux模块化加载命令?

    linux模块化加载命令?,软件,系统,设备,代码,信息,环境,适当,资料,网上,电脑,

    linux命令加载模块?

    linux命令加载模块?,设备,系统,工具,检测,信息,模块,内核,文件,命令,杂项,lin

    备份数据库命令linux?

    备份数据库命令linux?,服务,网络,备份,数据,工具,设备,系统,一致,数据库,命

    linux命令和应用程序?

    linux命令和应用程序?,软件,系统,环境,管理,基础,情况,位置,电脑,工具,中心,

    linux登录数据库命令?

    linux登录数据库命令?,地址,系统,名字,服务,软件,标准,灵活,命令,数据库,读