Sql server 对于一个可能大规模扩展的应用程序,我们应该从多个小粒度数据库开始吗

Sql server 对于一个可能大规模扩展的应用程序,我们应该从多个小粒度数据库开始吗,sql-server,database,database-design,architecture,scalability,Sql Server,Database,Database Design,Architecture,Scalability,我们正在开发一个新的电子商务网站,并首次使用NHibernate。目前,我们正在将数据拆分为多个SQL Server数据库,并按功能区域进行划分。所以我们有一个用于用户信息,一个用于订单,一个用于产品目录等等 我们对这一决定的理由有两方面: 该网站潜力巨大,是英国最大在线品牌之一的新网站,我们认为,通过按功能线划分数据,我们将能够将数据库移动到其自己的服务器上,这将为我们提供一个简单的扩展路线,如果我们需要的话 我的团队一直以这种方式工作——部分原因是遵循了以前项目中的MS Commerce服务

我们正在开发一个新的电子商务网站,并首次使用NHibernate。目前,我们正在将数据拆分为多个SQL Server数据库,并按功能区域进行划分。所以我们有一个用于用户信息,一个用于订单,一个用于产品目录等等

我们对这一决定的理由有两方面:

该网站潜力巨大,是英国最大在线品牌之一的新网站,我们认为,通过按功能线划分数据,我们将能够将数据库移动到其自己的服务器上,这将为我们提供一个简单的扩展路线,如果我们需要的话

我的团队一直以这种方式工作——部分原因是遵循了以前项目中的MS Commerce服务器模式

然而,在互联网上阅读这一决定时,我们发现,对这种模式的正常反应是极其严厉的。现在为开发人员创建更多工作以便以后为开发人员创建更多工作是Stack Overflow的一个示例注释

此外,NHibernate只需要一个数据库就可以轻松使用,只需要一个SessionFactory。知道堆栈溢出在很长一段时间内只从一个盒子中溢出,我想也许我们不应该这么聪明


所以,我的问题是,我们是否正确地认为使用细粒度数据库可能会提高我们的扩展能力,还是应该牺牲它以便于开发?

我从未在这样的项目中工作过。我已经习惯了有几百个表的数据库,这从来都不是问题

因此,我不能说你的想法是否好,我从未尝试过。我的团队一直以这种方式工作,这一论点是许多决策的主要驱动力,我甚至不能说它总是错的

使用NHibernate,您可以在类中组织数据。它们可以位于不同的名称空间和程序集中。您通常不会直接使用数据库,也不需要这种结构


关于可伸缩性的争论:我不确定当您每次需要访问几个数据库时,它是否真的可以很好地伸缩。我的意思是:你总是需要用户和订单,甚至更多。然后您需要从多个数据库获取所有这些数据。

为什么不正确地设计数据库并将文件放在适当的磁盘上呢?如有必要,请使用群集。创建多个数据库并不是一个固有的可扩展解决方案。还有-跨数据库引用完整性?祝你好运


你对“巨大”的定义是什么?SQL Server可以处理海量数据库,但我学到的一点是,人们通常不知道大量数据的组成部分。

完全同意starskythehutch的观点-将相关表放在同一个数据库中。但是,你可能想考虑对你的主要产品没有相关或非关键的事物有单独的数据库;但这是应用程序的一部分

例如:如果您决定将站点的每次访问/点击记录在数据库中,那么您可能应该将其保存在单独的数据库中

您应该考虑的原因: 1.大量的交易——比如说几十万次/秒。在一个单独的数据库中包含非关键的、与联合国相关的内容将确保避免由此引起的tlog冲突

恢复、DBCC CHECKDB、备份时间。如果在主数据库中填充不相关的非关键内容,则实际上是在增加数据库的大小,这将影响这些操作。将其放在单独的数据库中将有助于提高这些操作的性能。
我们是否正确地认为使用细粒度数据库可以提高我们的扩展能力你的断言基于什么?@Mitch:body中的第1点。你将什么定义为巨大?1不能证明这个断言是正确的。你测量的数字在哪里?你说的是每分钟多少笔交易?人们通常不知道什么构成了大量的数据没错+1与其说是数据集的大小,不如说是我们正在考虑的使用量。所以你会建议使用一个数据库,只是将不同的表映射到不同的存储?这是因为磁盘I/O始终是主要的瓶颈吗?同意参考完整性问题-您可以订购不存在的产品和不存在的用户。听起来很有趣。本质上是的。请记住,您可以使用表分区将表的不同部分映射到不同的磁盘,这样您就可以将未更改的数据放在raid磁盘的一个读/写速度非常快的部分上,将更改的数据放在读/写性能良好的raid磁盘上。@Gaz:如果您的OLTP数据库服务器硬件和软件设置正确,然后,80%的读取页面应该在内存中,几乎没有磁盘访问。数据写回是惰性的。