如果我希望将多个数据库合并到一个数据库中,我应该记住什么?

时间:2010-02-12 19:26:53

标签: sql-server sql-server-2005 database-partitioning

我正在与六个数据库合作。数据库都具有相同的模式,相同的SP等。对于最初设计数据库的人来说,使用许多数据库的动机很大一部分就是效率;另一种方法是在几乎每个表中添加一个列,并在数据库中添加sp,指示正在处理哪个数据集,从而产生一个巨大的(因此更慢)数据库,而不是几个小数据库。代替有一个列来指示正在查询哪个数据集,连接字符串用于选择正在命中哪个数据库。

我真的不喜欢这个组织的唯一原因是它涉及大量的代码重复,因此会损害维护。例如,每次我想更改存储过程时,我都需要在每个数据库上运行alter语句。

我考虑过的一个解决方案是将所有数据合并到一个大数据库中,在整个地方添加一个额外的列,以指示如果我没有合并它,数据将在哪个数据库中。然后,我可以按此列的值对所有表进行分区。理论上,所有这些的结果是所有数据本身的基础表示在道德上与现在相同,但没有索引,模式,SP等的冗余。

我的问题是:

  1. 这是个好主意吗?有没有更好的方法来实现这个目标?
  2. 这样做有什么问题吗?
  3. 这会对性能产生影响吗?

3 个答案:

答案 0 :(得分:3)

每个人都会在某个时候处理这​​个问题。我个人的观点是,多个数据库是背后的痛苦,并不快。由于维护问题,它们很痛苦。如果正确设置了索引,则根据需要在每个表中添加额外的列不会减慢您的流程。而且您的维护将更容易。此外,跨多个数据库进行交易可能很麻烦并涉及MTC。

BTW,使用单个数据库通常称为多租户数据库。您可能想稍微研究一下。但如果可能的话,我会避免使用多个DB。

答案 1 :(得分:1)

我与兰迪的想法不同。

多租户模型有其优点。

首先,无论您有5个数据库还是500个数据库,维护都没有太大差别。在某些时候,您不再需要维护单个数据库并查看该数据库。是的,您必须序列化备份,并且不能同时在所有数据库中执行索引重组/重建。

但是对于多个或多或少相同的数据库中的代码更改,有一些简单的方法可以编写很多事情来编写多个数据库,而无需真正解除额外的手指。我使用了一个名为SQLFarms Combine的工具(现在由JNetDirect销售),但是还有其他产品,比如我没玩过的RedGate MultiScript。

我最喜欢多租户模型的是,当你成长并扩展并突然需要一个新的数据库服务器时,很容易将其中一个租户(比如最忙或最快的)移动到新的服务器。如果每个人都被卡在同一个数据库中,那么只提取他们的数据变得非常困难,特别是如果要最大限度地减少停机时间。在多租户模型中,您可以仅为其数据库设置镜像,然后在准备好时切换主数据库。

答案 2 :(得分:0)

我赞成合并这些数据库。 SQL Server内置了其他工具来解决非常大的数据库的潜在性能下降问题,例如在第二个物理磁盘上进行额外的索引,分区,群集等。将架构更新部署到许多不同的数据库时所涉及的麻烦和开销在单个数据库中轻松处理时可能非常耗时。我认为SQL Server在这样的情况下可以很好地扩展 - 让数据库服务器按照它的设计去做,并提供对数据的响应式访问。您可以专注于应用程序设计,并将存储模型保留在SQL Server中。

此外,虽然上面没有提到,但我怀疑使用这种“多数据库”模型的应用程序中涉及某种程度的动态SQL,因为你必须根据你知道的事情在数据库之间切换,因此无法将硬编码到应用程序或配置文件中,这意味着必须动态生成连接字符串或实际SQL语句,这可能是一个非常大的安全风险(请参阅“SQL注入” “如果您不熟悉动态SQL的潜在风险。”