2013-12-13 26 views
0

這是我的情況 - 我知道這不是第一次出現,但我找不到適當的文檔來解決我所有的擔憂......我們有一個環境,需要爲一堆商店建立一個集中/彙總的Web服務和數據倉庫,每個商店也將擁有本地資源(相同的數據庫,本地Web服務)。SQL Server - Hub/Spoke disconnect model

這個想法是,所有東西都可以作爲一個集中式解決方案 - 只要網絡啓動,所有事物都會在數據倉庫中運行,但是當網絡連接斷開時,我們希望商店通過依賴本地Web服務/數據庫實例。當然,當鏈接返回時,每個輪輻都需要將他們的離線x操作推回數據倉庫。

在正常情況下,新增加的行應該在商店的本地數據庫中一旦寫入數據倉庫就立即存在,所以如果鏈接被破壞,商店就有自己的數據直到最後一秒(它在連接結束時沒有你自己的商店數據會很諷刺,但仍然 - 它必須通過DW完整性)。

我不希望副本中的所有重要表格(儘管我猜這會解決問題),比如「Offline_Transactions」,「Offline_Orders」等,因爲要管理的#/表格是將是巨大的。

這是回寫(正常的x行動,推動DW行回到輻條,所以他們總是最新),我認爲這造成了問題。因爲這可能會讓數據庫脫離同步(如果記錄被寫入DW中,但當鏈接嘗試將行復制到分支時鏈接關閉或服務關閉),即使是具有StoreId + RowId的複合鍵也可能潛在包含重複項。

所以我想我會做的是有一個可以爲空的GUID列,它只在'離線'模式在輻條中使用。在正常操作下,此列將爲空(當DW首先創建行並將其複製回商店的spoke數據庫時)。當鏈接關閉並且商店的分支數據庫正在創建「分離」記錄時,它們將包含保證唯一性的GUID,然後當鏈接恢復時,會運行一個進程,調用中央DW的Web服務將這些行合併到DW中。

我遇到的任何解決方案遇到的問題是聚集索引。必須有一個用於執行,但是如果任一方的數據可能在重要列中有空位(輪詢記錄具有GUID但沒有順序的標識列值並且DW記錄具有ID值但沒有GUID),則可以模式必須有所不同(我想避免)或此解決方案失敗。

我正在考慮做的是使用col的複合聚集索引:GUID和真實遞增ID。我的想法是,在數據倉庫方面,它不應該產生任何影響,因爲不會有任何GUID需要處理,當數據從分支被推送到中央倉庫時,它們將被剝離。它應該像ID列上的標準聚簇索引一樣行動/執行,對吧?

好處 - 我希望 - 我可以在輻條上使用相同的模式,並且當添加「分離」行時,它們將始終保持其獨特性,同時索引可能會在連接斷開時丟失數據。將不會使用GUI處理數百萬甚至1,000行的行,只有少數幾行直到鏈接恢復,然後一旦兩個環境同步備份,一切都恢復良好。

所以 - 請告訴我爲什麼這是有史以來最糟糕的想法,並且/或者指出了更簡單/更好的方法來管理這個問題,或者一般來說幫助我。

TIA。

回答

0

如果您沒有數據權限,您將會遇到瘋狂的使用案例。

這是我的意思。如果倉庫控制的數據(即脫機時將更改的數據)可以由其他方(例如另一個倉庫)更改,那麼當它處於聯機狀態時,解決方案將非常困難(無需專人操作。 )我說我有10例,現在我有20例,但其他人從10例改爲5例(可能他們想要訂購)。你如何解決這個問題......值應該是5,10,20,15嗎?

這變得非常複雜很快。

如果你不允許這樣做,那麼你是安全的,如果你有數據擁有的各方可以離線修改它,那麼你有一個更簡單的過程 - 回來發送更新,那些是正確的值。也許另一個倉庫可以提出請求,但不能更改這些值。

我想你需要設計這些多用戶規則,然後纔開始考慮數據模型,因爲它會產生影響。

+0

同意,但客戶想要什麼客戶想要的。我的想法是,離線訂單更像是要求,一旦它們合併回主DW,它們可以被滿足或不被滿足。瘋狂複雜,但如果一家商店想要兩全其美 - 儘可能保持最新狀態的能力,但是當d-co'ed時仍然可以交易,whaddyagonnado?無論如何,我現在更關心我對SQL的具體使用/濫用和索引 - 是否有一個可怕的主意,讓一個col的複合索引大多爲null? – user2403744

+0

@ user2403744 - nope,該索引應該沒問題。 – Hogan

+0

@ user2403744 - 就像你上面描述的那樣,權限不是本地倉庫。我預計這會對客戶非常直觀(但對您而言可能有意義)。通過他們運行一些用例 - 我敢打賭,他們會希望本地脫機DB成爲權威。實現整個事情並不得不將其切換,尤其是因爲它可能會影響您的數據模型。 – Hogan