簡體   English   中英

Mysql子類型和超類型-數據庫建模

[英]Mysql Subtype and Supertype - database modeling

我將要開發一個用於學習目的的個人項目。 一個房地產網站,廣告商(注冊用戶)可以在該網站上發布其物業(公寓,土地,房屋等)的廣告,以出租(在規定的期限內或在規定的期限內)或出售。 此外,客戶(訪客)可以在特定位置搜索特定類型的房地產以進行租賃購買

商業規則:

  • 用戶是注冊用戶。
  • 用戶只有一個角色(用戶,管理員等)。
  • 角色屬於許多用戶(每個用戶的默認角色是用戶)。
  • 用戶有一個位置,只有一個位置(位置是指地址)。
  • 位置屬於許多用戶。
  • 用戶有許多屬性(用於出租或出售)。
  • 財產屬於一個用戶。
  • 財產屬於一個位置(位置是指地址)。
  • 文件屬於屬性。
  • 屬性有許多文件(基本上是圖像)。

在此處輸入圖片說明

我進行了很多Google搜索,在databaseanswers.org中看到了一些數據庫建模,但是我對屬性的類型/功能一無所知,我無法弄清楚,我不知道最佳解決方案! 因為每種類型的財產都有不同的功能,例如公寓有房間,浴室...但是沒有土地 ,對於土地,我們可以說它們是在市內還是在市外……

我希望將此數據庫設計為更具可維護性和可伸縮性。 我不希望數據庫設計結構在開發時引起更復雜的查詢/代碼。

如果您能給我一些有關“小”問題的建議,我將不勝感激。

我是否必須將每個屬性類型分隔到它們自己的實體 (表),例如Apartments表, Lands表, Houses表……這樣,我可以將它們附加到自己的Feature中

還是我必須將它們與所有功能合並在一個表“屬性”中 ,並用另一個表“類型”將每個屬性鏈接到其類型(如“帖子”和“類別”)。

還是我必須創建四個表“ Properties”, “ Type”, “ Features”和數據透視表“ feature_property”

  • 財產屬於一種類型(公寓,土地,房屋等)。
  • 類型具有許多屬性。
  • 功能具有許多屬性。
  • 屬性具有許多功能。

還有一種更接近關系建模的邏輯根的替代方法-為每個要素創建一個表,並在其中包含一列用於表示屬性ID和屬性的列,以測量或描述該要素。 此類表中的記錄表示該功能適用​​,沒有記錄表示該功能不適用。

至於哪種方法最好,這取決於。 正確的方法是先根據集合,依賴項和約束條件構建邏輯模型,然后構造表以實現邏輯模型。 我建議您看一下對象角色建模,這是概念/邏輯建模的良好學科。

也就是說,我們可以比較不同的物理方法:

首先,將一堆可為空的屬性組合到一個表中非常簡單,但是null會帶來復雜性,您必須在代碼和查詢中處理這些復雜性,並注意屬性之間的隱藏依賴性。 這對於簡單的正交屬性最有效,當您擁有相互依賴的屬性時,將它們移到子類型/功能表可能會更好。

當您需要對事物子集實施約束時,子類型表可以很好地工作。 例如,如果每個公寓必須與一個不適用於土地和房屋的管理組織相關聯,則可以通過子類型強制實施。

所謂的數據透視表可以很好地標記或關聯事物,但不適用於度量事物。 對於簡單的是/否情況,以及用戶是否可以添加或刪除標簽,我會考慮采用這種方法,如果我具有一組固定的功能,可能就不會,而如果這些功能具有參數,幾乎可以肯定不會。

上面介紹的按功能表允許您隨意組合功能,FK約束可用於使某些功能依賴於其他功能。 它功能強大,但可以生成更多表,從而增加了開發人員的認知負擔。 這實際上是子類型化方法的一種變體。

我在項目中使用了所有這些方法。 請記住,即使是經驗豐富的數據庫開發人員,在沒有邏輯模型的情況下構建表時也很容易錯過異常,因此了解常規形式並牢記依賴關系很重要。 更好的是,將它們寫出並進行檢查,這比必須修復不一致的數據要少得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM