2013-01-07 68 views
5

我想實現產品在類別中的過濾功能,我對正確的數據庫架構有疑問。 現在我有如下表:產品屬性的數據庫架構

分類

1. id 
2. category 
3. description 

產品

1. id 
2. category_id 
3. product 
4. image 
5. price 

屬性

1. id 
2. attribute 

Category_Attributes

1. category_id 
2. attribute_id 

和我有問題是我應該創建哪些表和哪些列喊他們來存儲不同類型的值,屬性值,產品屬性值等

會這是正常的創建3個表:

1. id 
2. value 

Attributes_Values

1. attribute_id 
2. value_id 

Products_Attributes_Values

1. product_id 
2. attribute_id 
3. value_id 

我在最後的表搞砸。什麼會更好地存儲和過濾?

+0

你能解釋一下你想用最後三張桌子想要達到什麼嗎?每張桌子的意圖是什麼?價值是否是一個標準清單?這個清單是否取決於類別?產品可以有多個屬性值?如果沒有更好地理解您的要求,很難給出建議。 –

+0

例如,我有類別「珠子」,它將有幾個屬性:直徑,材料,包裝。直徑將爲8毫米,10毫米,12毫米等,材料也可以改變塑料,木製,玻璃,金屬,陶瓷。在管理區域中,我想要選擇所有屬性並選擇唯一的一個選項。在目錄中,我想自由過濾我的商品,例如我正在尋找直徑10mm,12mm和材質陶瓷珠。 – UAMoto

+0

是的,每個類別都有其屬性,這些屬性將具有它們的值。 – UAMoto

回答

8

什麼你正在努力實現是一個實體 - 屬性 - 值(EAV),也可能是排造型解決方案。請注意,這種類型的結構在很大程度上被很多不好的理由所折服。

然而,我已經指出(例如hereherehere,和here),該EAV是邪,除了當它不是。除了需要檢索這些內容並將其打印出來的情況之外,其中一種罕見的例外情況是您正在跟蹤產品屬性的產品目錄,以及這些屬性對您的系統不感興趣(到您的系統!)一個產品網頁或比較柵格等上

考慮這樣的設計:

enter image description here

你在做什麼在這樣的模型描述其屬性的產品在一個給定的類別應該擁有這些屬性可能具有的價值,以及每種特定產品對ea具有的價值ch屬性。

這種設計確實具有EAV強加的所有常見限制。但是,如果您想提問如下問題:「哪些珠子直徑爲8毫米?」這非常簡單。

+0

如果我們使用'eav',我們不會遇到性能問題嗎?如果我們面對你會給解決性能問題的建議,那麼是否有任何方法來防止這種情況? – fresher

+0

@PhpBeginner是的,使用EAV可能會帶來各種挑戰,這就是爲什麼很多人認爲它是反模式。我自己不會使用EAV,除非在特別適合EAV的特殊情況下。我認爲[這裏](http://stackoverflow.com/questions/11779252/entity-attribute-value-table-design/11972029#11972029)和其他地方,在線產品目錄是其中的一個應用程序。在這種情況下,EAV不會成爲性能問題,並且與應用完整語義數據建模相比,它將使用更簡單的代碼。 –