3

我正在設計一個網站,允許用戶發佈分類廣告,並提供他們銷售的不同類型商品的詳細信息。但是,我有一個關於最佳數據庫模式的問題。單一遺傳還是多態?

該網站的功能很多類別(如汽車,電腦,相機),每一類廣告都有自己獨特的領域。例如,汽車具有諸如門數,品牌,型號和馬力等屬性,而計算機具有諸如CPU,RAM,主板型號等的屬性。

現在,因爲它們都是列表,所以我想到了多態方法,爲每個不同類別(計算機,汽車,相機)創建父級LISTINGS表和不同的子表。每個子表將有一個鏈接回LISTINGS TABLE的listing_id。因此,當獲取列表時,它將從關聯的子表中的鏈接行所連接的LISTINGS中獲取一行。

LISTINGS 
-listing_id 
-user_id 
-email_address 
-date_created 
-description 

CARS 
-car_id 
-listing_id 
-make 
-model 
-num_doors 
-horsepower 

COMPUTERS 
-computer_id 
-listing_id 
-cpu 
-ram 
-motherboard_model 

現在,這個模式是一個好的設計模式還是有更好的方法來做到這一點?

我考慮過單一繼承,但很快就沒有理會這個想法了,因爲表格太快會太大,但是後來出現了另一個困境 - 如果用戶在所有列表中進行全局搜索,那麼這意味着我將擁有分別查詢每個子表。如果我擁有超過100個不同的類別,會發生什麼情況?效率不高嗎?

我還想到另一種方法,其中有一個主表(元表),它定義了每個類別中的字段和一個存儲每個列表的字段值的字段表,但是會違背數據庫規範化嗎?

像Kijiji這樣的網站會怎麼做?

回答

2

您的數據庫設計沒問題。沒有理由改變你所擁有的。我已經看到搜索做了幾個方法。一種方法是讓您的搜索存儲過程加入您需要搜索的所有表,並對要搜索的列編制索引。第二種方式我看到它做得很好,就是有一張只用於搜索的表格,它可以獲得需要搜索的任何字段的副本。然後你會在這些字段上放置觸發器並更新搜索表。

他們都有缺點,但我更喜歡第一到第二。

編輯

您需要以下表格。

分類 - 編號 - 描述

CategoriesListingsXref - 類別編號 - ListingId

與此交叉參考模型,你可以搜索過程中加入給定類別的所有目錄。然後添加一點動態sql(因爲它更容易理解)並構建查詢以包含要搜索的字段並在查詢中調用execute。

就是這樣。

編輯2 這似乎是一個更大的討論,我們可以在這些評論框中發現。但是,通過閱讀以下文章可以理解我們要討論的任何內容。 http://www.sommarskog.se/dyn-search-2008.html

這是真正完整的,並顯示你有多種方式做與親和缺點。 祝你好運。

+0

如果他們具有不同的屬性,我會如何將CARS表和COMPUTERS表一起加入? – peter 2010-12-09 20:30:35

0

我認爲你選擇的設計對於你剛纔描述的場景來說是很好的。雖然我不確定子類表是否應該有自己的ID。由於CAR是一個列表,因此這些值來自同一個「域」是有意義的。

在典型的分類廣告網站中,廣告的數據只寫一次,然後基本上是隻讀的。您可以利用它並將數據存儲在第二組表格中,這些表格可以更加優化,以便按照您希望用戶搜索的方式進行搜索。此外,搜索問題只存在於「一般」搜索中。一旦用戶選擇了某種類型的廣告,您就可以切換到子類表以便進行更高級的搜索(RAM> 4GB,CPU = overpowered)。