2011-12-26 87 views
1

我正在尋找在數據庫中進行多對多映射的最佳實踐。許多至多數據映射的最佳實踐

例如,我有兩個要映射的表。我創建了第三個表來存儲這個映射。

Database Diagram

在UI我有幾個A中映射(或沒有)多與B.我看到現在兩個解決方案:

1 - 在每一個更新的AI每個記錄將刪除所有映射的數據爲它並插入新的數據映射。

  • 優點:我只存儲映射數據。
  • 缺點:我需要每次都使用delete和insert語句。

2 - 我需要添加新位列到名稱isMapped的AB表。我將存儲從A到A的每個記錄的所有映射的所有映射。在保存映射操作時,我將只使用更新語句。

  • 優點:無需每次都刪除和插入。
  • 缺點:需要存儲不必要的記錄。

您能否爲我提供最佳解決方案?

感謝

+0

爲什麼您認爲您必須刪除表(1)中的每個更新的所有映射數據?如果您更新了映射,則映射本身不會更改,例如,「AName」。 – a1ex07

回答

3

你已經列出的2個選項之間我會選擇no 1,isMapped沒有意義,如果它們沒有映射記錄應該不存在在第一位。

你還是有,雖然多了一個選項:

DELETE FROM AB where Not in the new map 
INSERT INTO AB FROM (New map) where NOT in AB 

如果這些大量的地圖我會刪除和來自新的映射插入的,否則我會直接刪除所有然後再插入像你所提出的建議。

3

我說任何時候你看到第二個小點在你的#2情景

「需要存儲不必要的記錄」

這是你的紅旗不使用該方案。

您的數據在場景1中正確建模,即當A和B中的記錄之間存在映射時映射表中存在映射,並且映射表中映射不存在時,在A中的這些記錄之間沒有映射和B.

此外,更新語句的基礎機制是刪除,然後是插入,所以您不是通過發出一個而是真的保存數據庫的任何工作。

最後,說到保存數據庫的工作,不要在這個階段嘗試去做。這是他們設計的。 :)

正如您在方案1中一樣正確實施您的數據模型是您可以做出的最佳優化。

一旦你有了基本的規範化結構並且有了一些測試數據,那麼你就可以開始測試性能並在必要時進行重構。添加索引,改變數據結構等。