我有一个包含“模块”的大型应用程序,例如Finance
,HR
,Sales
,Customer Service
。
为了使应用程序易于管理并分配负载,我决定在单个服务器上为每个模块提供自己的数据库。还有一个Master
数据库用于保存主信息,例如有关用户的信息,一些全局查找表和一些安全性内容。
我现在正在尝试决定是否将特定于模块的存储过程放在相应的数据库中,或者是否将它们全部保存在Master
数据库中。例如,有一个名为dbo.sales_customer_orders
的存储过程,它仅从Sales
数据库表中选择数据。当然,这个SP将由用户执行很多次。因此,它应该在Sales
数据库中还是可以在性能/可伸缩性/可靠性/安全性方面将其保留在Master
数据库中。
存储过程与其选择的数据库位于不同的数据库中是否重要?
答案 0 :(得分:1)
根据我的经验,您不会通过在多个数据库之间分片数据而立即遭受性能损失,这实际上是大型n层应用程序中的常见做法。将数据库移动到不同的服务器时,您显然会受到一些轻微的惩罚。
您可以在网站上看到此blog post 以及其他几个讨论分片数据的正确方法以及使用多个连接字符串进行读取和写入以便于扩展和可能的缓存层的重要性稍后的。
答案 1 :(得分:1)
您如何实际计划开发所有这些数据库?如果您想使用SSDT,您将被所有这些跨数据库依赖项淹没。此外,如果某个特定客户决定不购买销售模块(并且周围没有销售数据库),那么您的程序将驻留在head
数据库中是没有意义的。在这种情况下,调用它将导致一些非常令人不愉快和意想不到的后果,例如批处理中止和(可能)事务处于打开状态。
将类似的东西放在一起;否则,你的方法将没有模块化。
性能方面,通常在同一SQL Server实例中跨数据库调用没有区别。但是,如果您的分片位于不同的实例上,则结果可能介于"稍微明显的位置"有害的"有害的" - 这取决于很多因素,并不是所有这些因素都可以被DBA减轻。