2012-08-15 79 views
1

我有三個網站,使用抽象的數據庫結構,像表:項目,地方,類別等...和存儲過程,如GetItemsByCategory,GetRelatedItems等...其實我正在使用這3個不同網站的數據庫結構相同。多個網站,使用相同的數據庫結構

從代碼的角度來看,即使所有網站使用相同的代碼(除特定的foreach之外的HTML),並且所有常見代碼都是由所有網站使用的少數項目,所以每次檢測到一個bug是在所有的網站)我只是修復它在一個地方(所有使用的共同部分),並自動所有網站得到修復。

其實我使用Asp.net MVC3和Sql服務器。

每次我想擴展一些funcionality,我需要一個新的表,存儲過程或與數據庫相關的東西,我必須在每個數據庫中進行修改。

  • 您是否知道我可以使用的任何方法能夠具有相同的靈活性,並且只對所有網站進行一次數據庫修改?

  • 您是否認爲我正在使用一種好的方法,或者我應該在您的意見中使用不同的東西?

回答

1

如果數據庫在一臺服務器上,你可以生成從Management Studio中的程序腳本,並確保使用該選項「檢查對象的存在」(工具>選項> SQL服務器對象資源管理器>腳本)。這會產生這樣的事情(最重要的是它產生的存儲過程的代碼的東西,你可以使用動態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_msforeachdb更換的定製版本:http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx & http://mssqltips.com/tip.asp?tip=2201

我用了一個名爲SQLFarms Combine這個工具,但該工具似乎不存在了,或者也許它已被另一家公司吞併/重新品牌化。

0

如果您向名爲websiteId的所有表中添加了一列,則可以只有一個數據庫。在每個網站的web.config中存儲唯一的websiteId,並將其與每個數據請求一起傳遞。很顯然,每個網站的數據都與他們的網站ID一起存儲,因此每個網站都可以查詢數據。

這意味着你的數據庫和任何對你的數據庫的調用有點重構,但一旦完成,你只有一個數據庫來維護。

當然這是假設你的數據庫在同一臺服務器上...