【问题标题】:Multiple websites that uses same database structure使用相同数据库结构的多个网站
【发布时间】:2012-08-11 23:20:48
【问题描述】:

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

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

其实我用的是 Asp.net MVC3 和 Sql server。

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

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

  • 您认为我使用的是一种好方法还是我应该使用您认为不同的方法?

【问题讨论】:

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


    【解决方案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 sys.sp_executesql @sql;
    

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

    我曾经为此使用名为SQLFarms Combine 的工具,但该工具似乎不再存在,或者它可能已被另一家公司吞并/重新命名。 Red Gate 此后制作了具有类似功能的SQL Multi Script

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-05
        • 1970-01-01
        • 2013-03-14
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多