3

我們有一個使用泛型表設計的規範化的SQL Server 2008數據庫。因此,我們沒有爲每個實體(例如Products,Orders,OrderItems等)提供單獨的表格,而是使用通用表格(實體,實例,關係,屬性等)。Syncrhonizing 2數據庫具有不同的模式

我們已經決定建立一個單獨的非規範化數據庫來快速檢索數據。假如他們有不同的模式,您能否請我提供各種技術來同步這兩個數據庫?

乾杯, MOSH

+0

這是否需要實時或通宵提取 - 轉換 - 加載過程? – Paolo 2010-07-13 07:28:03

+0

https://www.symmetricds.org/是開源的,我相信應該這樣做 – kervin 2016-10-06 19:38:33

回答

3

當兩個數據庫有你應該看的數據遷移或複製,不同步的技術,以便從根本上不同的模式。 SQL Server爲此提供了兩種技術,SSIS和複製,或者您可以編寫自己的腳本來執行此操作。

複製將從源數據庫獲取新的或修改的數據並將其複製到目標數據庫。它提供了調度,打包和分發更改的機制,可以同時處理實時和批量更新。爲了工作,它需要在兩個數據庫中添加足夠的信息來跟蹤修改和匹配行。在您的情況下,很難確定哪些「產品」發生了變化,因爲您必須在4個或更多不同的表中標識所有相關的修改行。它可以完成,但需要一些努力。在任何情況下,您都必須創建與目標模式匹配的視圖,因爲複製不允許對源數據進行任何轉換。

SSIS將從一個來源提取數據,將其轉換並推送到目標。它沒有用於跟蹤更改的內置機制,因此您必須將字段添加到表中以跟蹤更改。這是嚴格按照時間表運行的批處理過程。主要好處是可以執行各種各樣的轉換,而複製幾乎不允許(除了從視圖中繪製數據)。您可以創建數據流,以便在「產品相關屬性」記錄更改時僅修改相關的「產品」字段,或者只需重新構建整個產品記錄並覆蓋目標記錄。

最後,您可以創建自己的觸發器或存儲過程,這些觸發器或存儲過程將在數據更改並將數據從一個數據庫複製到另一個數據庫時運行。

我還應該指出,你可能已經過度規範化你的數據庫。在所有這三種情況下,如果您加入所有表以重新構建實體,則會造成一些性能損失,從而導致需要大量的鎖定以及索引的低效使用。爲了易於改變,您犧牲了性能和可伸縮性。

也許你應該看看SQL Server 2008的Sparse Column功能,以便在保持性能和可伸縮性的同時支持靈活的模式。

+0

非常感謝您長時間詳細回答。只有幾點想法:我想創建我自己的存儲過程來更新目標數據庫。但是,這會阻止最初的請求(即修改數據)。換句話說,用戶必須等到數據更新到兩個地方。我讀了一些關於nServiceBus的內容,並認爲我可以實現一個可以異步調用的單獨的denormalizer。這樣,用戶可以快速獲得響應,而無需等待Read數據庫被更新。你對此有何想法? – Mosh 2010-07-15 03:19:16

+0

另外,就SSIS而言,您提到它按照計劃運行。在這種情況下,這對我來說不是問題嗎?假設用戶插入一個新產品,但SSIS可能會在兩個小時後運行。假設讀取數據的所有查詢均由Read數據庫處理,則用戶可以插入一個新產品,並且在兩個小時內不會看到它! – Mosh 2010-07-15 03:20:50

相關問題