如何設計一個表,其中的欄位因類別而異?
我正在嘗試設計一個數據庫來發布免費廣告。例如http://www.gumtree.com.au/p-post-ad.html
場景:每個廣告都有不同的類別,有些類別會有更多的子類別。因此,表 AD 將根據其類別具有不同的欄位。例如,二手車廣告將包含 MAKE、MANUFACTURER 等,但書籍廣告將包含書名欄位、作者欄位等。
那麼如何為廣告設計表格?
我可能會想到兩種解決方案。一,為表格廣告中的類別創建子類型。二,為每個類別的廣告創建單獨的表格(這聽起來不是一個好的設計)。
以表格格式儲存資訊。它還將幫助您在應用程序級別進行驗證。將您的欄位類型儲存在屬性表中。和列表中的值。
希望能幫助到你。
我會避免為每種廣告類型使用完全獨立的表格,那將是糟糕的設計(您最終不得不
UNION
在幾乎每個查詢中將它們全部放在一起)。還要避免在一個表中包含所有可能的欄位,因為這也會降低效率,尤其是在您的數據庫不支持稀疏行的情況下。這類問題的常用技術是“表繼承”(因此請搜尋該術語以獲取更多範例,您有一個包含所有常見屬性(在本例中為日期、標題、描述和所有者)的核心表,列來指示廣告的類型和每種類型的額外表格。因此,對於汽車,該
ad_type
列將包含“汽車”,並且可以在ad_detail_car
表格中找到詳細資訊。例如:ad_common ad_detail_car =========== ============= advert_id -----> advert_id advert_type | make caption | manufacturer description | owner | ad_detail_book price | ============== |--> advert_id | isbn | binding | | ad_detail_kitten | ================ `--> advert_id breed age
advert_id
將是公用表的 PK 以及明細表中公用表的 PK 和 FK。隨著廣告類型數量的增加,為每種廣告類型創建一個單獨的表格可能會變得一團糟,因此您可能會考慮這樣的屬性包:
ad_common ad_extra_properties =========== =================== advert_id -----> advert_id advert_type property_name caption property_type description property_value owner price
這裡屬性包的PK是
advert_id,property_name
。但請注意,這是一種模式(稱為 EAV 或“實體屬性值”模式),它有自己的一組問題,尤其是在報告方面,因此在考慮它是否適合您的需求之前請先閱讀它。如果採用 EAV 模型,另一種選擇是完全取消詳細資訊或屬性包表,僅將額外屬性以對業務邏輯有用的格式(JSON、XML)儲存在主表的列中。這更簡單,但意味著(除非您選擇的數據庫本身支持此類文件)您不能直接在數據庫中報告或過濾/排序額外的屬性。