2012-09-22 79 views
2

我已經爲我的項目設計了幾種不同的方式,並且我很好奇如果人們認爲某個方法更爲正確,那麼他們會有意見。SQL模式設計和規範化

該示例將涉及用戶,商店,地址和電話號碼。

實施例A

  • 用戶表 - 包含所有主要用戶數據
  • 用戶地址表 - 包含所有地址數據
  • 用戶電話號碼錶 - 包含所有電話號碼數據
  • 商店桌子模仿上述標準

保存

一旦父實體被保存,其他一切可批量插入/更新

實例B - 地址表 - 包含了所有的地址數據 - 電話號碼錶 - 包含所有電話號碼數據

  • 用戶表 - 包含了所有主要的用戶數據
  • 用戶地址表 - 是連接表的地址表
  • 用戶電話號碼錶 - 是連接表的電話號碼錶
  • 存儲表 - 反映上述標準

保存

我將通過所有地址開始交易和循環一個接一個地保存它們。獲取最後一個插入ID並將它們鏈接到相應的外部實體。

此方法強制從我可以看到使用活動記錄,並有做批量插入/更新沒有解決辦法,但大大降低的「主」表量,在數據庫

思考

隨着時間的推移,我開始相信例子B是不正確的。規範化是關於不爲他們尊敬的實體複製數據,而不是複製整個數據庫的存儲區域。

無論如何,所有的想法/意見非常感謝。 謝謝!

更多的想法

所以,我一直在思考這個多一些,這裏是我的想法

用戶和存儲在這個例子中會陷入DDD的聚合根的範疇。 這就是說,沒有父母的情況下,任何子對象都不應該存在。

在示例A中,如果您刪除用戶或在那裏存儲將無法通過外鍵刪除它,我認爲它尖叫它打破了聚合根規則。

即使電話號碼和地址在數據庫中有唯一的id,甚至可能有那些id在數據庫中被引用,但它們仍然是值對象。用戶和商店將是這種情況下的真正的實體,具有電話號碼和地址的價值對象(儘管它們具有ID)

我也在例子A中感到困惑如何使用存儲庫模式加載事物而不需要存儲庫談話對彼此。這種新的思路也解決了這一問題。

回答

0

我會建議做到以下幾點。 創建一個不需要重複或多個記錄的表格。

用戶:所有用戶數據,包括電話號碼,地址ets 條件:當每個用戶具有單個電話號碼和單個地址時,應當應用上述內容。

上面可以使用,但多個電話號碼和地址,你將不得不使用逗號分隔的字段。要搜索逗號分隔的字段,您將不得不使用FIND_IN_SET。

用戶:所有用戶數據不包括電話和地址
電話:隨着用戶與國外KET
地址鏈接:與外鍵
在這種方法的用戶鏈接,你將不得不使用聯接
而對於插入和更新你將需要使用循環。

推薦
我會說使用第一種方法。當你真的需要它時使用第二種方法,例如用戶有很多帖子,所以創建一個表格帖子,因爲帖子可以太多不是有限的,但在地址和電話號碼的情況下,它們可能是有限的。