使用相同数据库结构的多个网站

时间:2012-08-15 16:22:41

标签: sql-server asp.net-mvc design-patterns

我有三个网站使用抽象数据库结构,其中包含以下表格:项目,地点,类别等...以及GetItemsByCategory,GetRelatedItems等存储过程......实际上我正在使用完全相同的数据库结构不同的网站。

从代码的角度来看,我对所有网站使用相同的代码(除了特定的foreach之外的HTML),并且所有公共代码都在所有网站使用的少数项目中,因此每次我检测到错误(这是在所有网站上)我只是在一个地方(所有人都使用的公共部分)修复它,所有网站自动得到修复。

其实我正在使用Asp.net MVC3和Sql server。

每次我想扩展一些功能,我需要一个新的表,存储过程或与数据库相关的东西,我必须在每个数据库中进行修改。

  • 您是否知道我可以使用任何方法来获得相同的灵活性,并且只对所有网站进行一次数据库修改?

  • 您认为我使用的方法是否合适?或者您认为我应该使用不同的方法?

2 个答案:

答案 0 :(得分:1)

如果数据库位于单个服务器上,您可以从Management Studio生成该过程的脚本,并确保使用“检查对象是否存在”选项(工具>选项> SQL Server对象资源管理器> ;脚本)这将产生类似这样的东西(最重要的是它产生你可以使用动态SQL执行的存储过程代码):

USE DBName;
GO

SET ANSI_NULLS ON;
GO

SET QUOTED_IDENTIFIER ON;
GO

IF NOT EXISTS (...)
BEGIN
    EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE dbo.whatever ...
    '
END
GO

现在您已拥有此脚本,您可以将其修改为跨多个数据库工作 - 您只需要滑动@statement =部分并重新使用它。首先,您需要将要使用它的数据库填充到@table变量中(或者,如果需要,可以将其放在永久表中)。然后,您可以构建一个在每个数据库中执行的命令,例如

DECLARE @dbs TABLE (name SYSNAME);

INSERT @dbs(name) SELECT N'db1';
INSERT @dbs(name) SELECT N'db2';
INSERT @dbs(name) SELECT N'db3';

-- now here is where we re-use the create / alter procedure command from above:

DECLARE @statement NVARCHAR(MAX) = N'CREATE PROCEDURE dbo.whatever ...
    ';

-- now let's build some dynamic SQL and run it!

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + '
  EXEC ' + QUOTENAME(name) + '.dbo.sp_executesql N''' + @statement + ''';'
  FROM @dbs;

EXEC sp_executesql @sql;

或者,您可以创建我的sp_msforeachdbsp_ineachdb替换的自定义版本:

我过去常常使用一个名为SQLFarms Combine的工具,但该工具似乎不再存在,或者它可能被另一家公司吞没/重新打上了品牌。

答案 1 :(得分:0)

如果您为名为websiteId的所有表添加了一列,则可以只有一个数据库。将唯一的websiteId存储在每个站点的web.config中,并将其与每个数据请求一起传递。显然,每个站点的数据都与他们的websiteId一起存储,因此每个网站都可以查询数据。

这意味着您的数据库中的一些重构以及对您的数据库的任何调用,但一旦完成,您只需要维护一个数据库。

当然这是假设您的数据库位于同一台服务器上......