4

我開始了一個新的應用程序,現在我正在尋找兩條路徑,並且不知道哪個是繼續的好方法。
我正在建設類似電子商務網站。我有一個類別子類
問題是現場有不同類型的產品,並且每個都有不同的屬性。這些產品屬性必須是可過濾
這是我最初的數據庫設計:我應該使用EAV數據庫設計模型還是使用大量表

Products{ProductId, Name, ProductCategoryId} 
ProductCategories{ProductCategoryId, Name, ParentId} 
CategoryProperties{CategoryPropertyId, ProductCategoryId, Name} 
ProductPropertyValues{ProductId, CategoryPropertyId, Value} 

現在一些分析我看,這樣的設計其實是EAV模型,我讀了人們通常不建議採用這種設計後。
似乎動態SQL查詢是一切都需要。

這是一種方法,我現在正在查看它。

我看到的另一種方式可能被命名爲很多工作方式但如果它更好,我想去那裏。 爲了使表

Product{ProductId, CategoryId, Name, ManufacturerId} 

,並使數據庫至極表繼承手段,使表像

Cpus{ProductId ....} 
HardDisks{ProductId ....} 
MotherBoards{ProductId ....} 
erc. for each product (1 to 1 relation). 

我明白,這將是一個非常大的數據庫,非常大的應用領域,但它比使用EAV設計的選項更好,更容易和更好的性能

+1

我不同意你的初始設計是EAV。 – 2013-03-06 15:53:31

+0

ProductPropertyValues表不是EAV?來吧。 – 2013-03-06 16:09:44

+0

你爲什麼認爲它不是? – 1110 2013-03-06 19:03:42

回答

5

EAV很少有贏家。在你的情況下,我可以看到EAV的吸引力,因爲不同類別將具有不同的屬性,否則這將很難管理。但是,假設有人想要搜索「所有硬盤數量超過3盤,使用SATA接口,以10k rpm旋轉嗎?」您在EAV中的查詢將會很痛苦。如果你想要支持這樣的查詢,EAV就沒有了。

然而,還有其他的方法。您可以考慮使用擴展數據的XML字段,或者如果您使用的是PostgreSQL 9.2,則可以使用JSON字段(儘管XML更容易搜索)。這會給你一個更大範圍的可能搜索,而不會讓EAV頭疼。權衡將是模式執行會更困難。

+0

是的,這正是迫使我問這個問題的問題。我已經制作了EAV結構和過濾產品由不同的類別迫使我使用動態sql和很多痛苦所以我開始重新調整數據庫到較小的表,現在我對我的40個繼承產品表感到滿意,但仍然分析問題... – 1110 2013-03-07 20:43:03

4

This問題似乎在更詳細地討論這個問題。

除了性能,可擴展性和有討論,也考慮到複雜性:

  • SQL數據庫如SQL Server具有全文搜索功能;所以如果你有一個單一的領域描述產品 - 全文搜索將索引它,並將能夠提供先進的語義搜索

  • 看看現在所有憤怒的no-sql系統;它們的可伸縮性應該是相當不錯的,它們爲非結構化數據提供支持,例如您擁有的數據。 Hadoop和Casandra是很好的起點。

+0

NoSQL數據庫不是我對此項目的興趣,所以我不能考慮它們。通過'...單個字段來描述產品...'您是否想將所有可能的屬性添加到產品中作爲列?這將是1000列的表我不能這麼做:( – 1110 2013-03-06 19:06:14

+0

不,這是所有這些屬性的單個列。 – 2013-03-07 12:09:11

0

你可以很好地使用EAV模型。 我們採用與物流應用程序相似的方式。它雖然建立在.net上。 除了表格之外,您的應用程序代碼必須正確處理對象。 看看你是否可以爲每個對象添加通用表。它適合我們。

相關問題