2016-09-14 69 views
0

我們有一個基於SQL-server DB的內部軟件,它有一個主表和多個連接表。我們存儲的數據的性質很難描述,但假設我們有一個帶有一些連接表的客戶表:訂單,出貨量,電話記錄,投訴等。SQL master-detail表 - 更好的UPDATE或DELETE + INSERT?

我們需要將此軟件與外部軟件同步擁有自己的數據庫(具有相同的結構),並生成一個XML文件,其中包含關於「客戶」的更新信息(每個客戶一個文件)。更新可以在主表中和/或在0到n連接表中。

要導入這些文件,一個選項是查詢所有涉及的表並將它們與XML文件進行比較,可能會添加 - 更新 - 刪除行。

這將需要大量的編碼。

另一種選擇是完全刪除給定客戶的所有數據(至少從已連接的表中)並再次插入它們。

這樣做效率不高。

請認爲主表有13個字段,並且有大約6個表具有3到15個字段。

在這個應用程序中,我們主要使用LINQ。

你將如何進行? PS:我在StackOverflow上發現了一些關於這個主題的答案,但是幾乎所有的關注(單行)都是單表格。

回答

0

對於我有很多連接和大量行的場景,我更喜歡更新並進行邏輯刪除。示例我擁有數百萬的客戶,並且發生了我擁有數十行的表格,其中有數百萬行,FK指向客戶ID。嘗試刪除客戶可能需要幾分鐘的時間。

對於您的特定場景,我可以在每個相關表中使用一個標誌來告訴我:這些行已經同步,該行被插入爲等待導出,行正在等待刪除或行被導出到xml過去但已更新。

對於出口:

它可以很容易地查詢只是等待被iserted,更新或刪除行和忽略行是最新的。

對於進口:

如果其他系統沒有這個設施有一個小竅門,你可以做。添加一個「外部ID」列以快速搜索您的數據庫並識別源自該外部源的行。 即使使用這個技巧,如果只有那個電話號碼在該大表中被更新,可能會很痛苦。對於那些極端情況,您可以使用哈希計算列快速確定兩行是否不同並更新整個(至少是公共列)行。

+0

謝謝讓你的答案。 數據永遠不會從我們的應用程序中導出。我們的應用程序主要是隻讀的,數據由第三方應用程序定期更新(通過xml)。 當然,每個xml文件都包含有關單個客戶的所有數據(包括我在數據庫中已有的數據以及需要添加/編輯/刪除的數據)。 因此,每次文件進入時,我都不知道應該更新什麼,除非我比較每一行。 我不清楚我如何使用標誌來處理所有這些。 – Disti

+0

標誌僅用於導出(其他系統無法告訴您什麼更新,插入,刪除)和邏輯刪除。對於導入,只有您可以創建「外部ID」,並且如果表很大,則還可以使用哈希列來查明是否有一個更新。您甚至可以對XML文件進行散列碼檢查,以檢查文件是否與先前版本相比有任何變化 – jean

0

一個想法(考慮到你在數據庫服務器端執行此操作):

  • 建表了客戶的XML。它可以是臨時表或內存表。
  • 創建SELECT查詢以查找新的,更新的和刪除的數據。這些select查詢會加入數據庫中的表格和客戶xml構建的表格。連接的輸出會告訴您是否有新記錄,更新記錄,刪除記錄或混合記錄。
  • 運行插入,更新,相應地刪除。
相關問題