23

我目前正在爲電子商務平臺的產品部分設計數據庫結構。它需要被設計成能夠銷售無限數量的不同類型的產品並具有無數不同的屬性。實體屬性值表設計

E.g.筆記本電腦的屬性是RAM,屏幕尺寸,重量等。書的屬性可以是作者,ISBN,出版商等。

看起來EAV結構似乎是最合適的。

  • 選擇產品
  • 產品屬於屬性集
  • 屬性集包含屬性x和y
    • 屬性x是數據類型的日期時間(存儲在attribute_values_datetime值)
    • 屬性y是數據類型int(存儲在attribute_values_int中的值)
  • 每個屬性定義deno TES的類型(I,E,x具有列型 - > datetype)

假設以上所述,我可以加入選擇至attribute_values_datetime表以獲得正確的數據沒有得到結果集和構建第二查詢現在桌子是已知的?會有大的性能命中構建這種類型的查詢或將在下面更合適的(雖然不太官能)

  • 選擇產品
  • 產品屬於屬性集
  • 屬性集包含屬性X和y
    • 屬性x是數據類型的日期時間但作爲TEXT存儲在ATTRIBUTE_VALUES
    • 屬性y被數據int類型但作爲TEXT存儲在ATTRIBUTE_VALUES
+7

不要使用EAV。不要介意性能問題(只會增長的大量表),考慮你將如何反對它。在大多數情況下,EAV正常化過度。 – Oded 2012-08-02 14:16:53

+0

你將如何處理屬性,你想使用它們進行過濾嗎? – Jodrell 2012-08-02 14:17:21

+6

我傾向於贊同@Oded,最終在數據庫中構建數據庫。我還想知道大型在線零售商採取什麼做法(好的)。 – Jodrell 2012-08-02 14:18:31

回答

29

我打算就這個問題的大部分意見提出相反的意見。雖然EAV是EVIL,因爲您可以在SO和DBA.SE以及其他地方多次找到徹底解釋的所有原因,但有一個非常常見的應用程序,大多數EAV出錯的東西大多不相關, EAV的(少數)優勢非常密切。該應用程序是在線產品目錄。

與EAV的主要問題是,它並沒有讓數據庫做什麼它是幹什麼的,這有助於給予適當的上下文的有關不同實體的信息不同的屬性真的好通過在模式安排他們。擁有模式在訪問,解釋和執行數據完整性方面帶來許多優勢。

有關產品目錄的事實是產品的屬性幾乎完全不相關到目錄系統本身。產品目錄系統(最多)具有三個產品屬性。

  1. 以下列形式向終端用戶顯示列表中的產品屬性:{attribute name}:{attribute value}。

  2. 顯示多個產品中的比較網格的屬性,其中不同的產品的屬性排隊彼此抵靠(產品通常是列,屬性通常是行)

  3. 驅動器規則的東西(例如定價)的基礎關於特定的屬性/值組合。

如果您的系統所做的是回傳與語義無關的信息(對系統),那麼此信息的架構基本上是無益的。實際上,模式在聯機產品目錄中會阻礙,尤其是如果您的產品目錄中有許多不同類型的產品,因爲您總是不得不回到模式中來修補它以允許使用新的產品類別或屬性類型。

由於它的使用方式,即使產品目錄中某個屬性值的數據類型不一定(非常重要)。對於某些屬性,您可能需要施加限制,例如「必須是數字」或「必須來自此列表{...}」。這取決於屬性一致性對您的目錄的重要性以及您希望實現的精細程度。縱觀幾家網上零售商的產品目錄,我認爲大多數人都願意爲了一致性而對簡單性進行折衷。

是的,EAV是邪惡的,除非它不是。

+0

1)如果我們使用'eav',我們可以採取什麼措施來防止使用'eav'後的性能問題,如果我們有成千上萬種產品,肯定會出現性能問題? – fresher 2016-09-22 10:44:50

+1

@PhpBeginner你爲什麼說性能問題是不可避免的使用產品目錄的EAV?我不認爲這是一個公平的評論。請具體說明哪些行爲會變差?這種泛化正是我在這個答案中所談論的。對於大多數應用來說,EAV **是邪惡的。在線產品目錄不是其中之一。在這個特定的場景中,你不能說「EAV很慢」,或者「EAV讓你的查詢變得複雜」,或者「EAV從數據中刪除含義」或者任何其他通常對EAV有效批評的東西。 – 2016-09-22 10:53:38

2

我不知道這應該是評論還是回答。儘管如此,我走了。

我不知道你到底在建什麼。但你有沒有看看Magento EAV database structure?是的,它可能很慢,查詢可能很大,但對我們來說,這些優勢超過了負數。另一方面,magento負責查詢。

我們正在將我們的在線商店(中大型商店)遷移到使用Magento,現在我們對EAV方法非常滿意。

2

是的,組裝EAV模型的查詢通常會帶來很大的代價。檢查數據的自我一致性會有更大的性能損失,因爲DBMS無法爲您做到。如果出現問題,DBMS不能告訴你。

通過更正統的數據庫設計,Oded在註釋中推薦,DBMS確保數據庫中的數據更接近一致。我強烈建議使用常規(非EAV)設計。