Database-Design

如何設計一個表,其中的欄位因類別而異?

  • August 27, 2015

我正在嘗試設計一個數據庫來發布免費廣告。例如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)儲存在主表的列中。這更簡單,但意味著(除非您選擇的數據庫本身支持此類文件)您不能直接在數據庫中報告或過濾/排序額外的屬性。

引用自:https://dba.stackexchange.com/questions/112410