2011-04-09 49 views
6

假設我有一個實體具有許多屬性,一些我現在知道,另一些將由用戶定義。建模的最佳方式是什麼?數據庫設計:對EAV還是不EAV?

1)我有一個主表,並將其與輔助名稱 - 值對錶關聯嗎?所有屬性都放在輔助EAV表中。

  • OR -

2)我把最常用的屬性(不是所有用戶都需要他們,所以我想到了很多空的條目)在主表,並有二次EAV表爲用戶定義的屬性?

  • OR -

3)其他一些方法,我都沒有想到的?

回答

0

通常,很多空單元很便宜,不值得正常化。唯一的缺點是如果你有大量的行(數百萬行 - 可能會出現性能問題),大量的行(大約超過20行 - 只是看着數據而煩人),或者EAV表格上有許多獨特的約束條件。這就是說,現在是2011年,現在使用帶有數據庫抽象層的編程框架是有意義的,這樣就不會直接設計數據庫關係。類似於Django的Object Relational Mapper,您可以專注於模型本身,並讓最佳實踐自己照顧自己(95%的時間)。這tutorial將幫助您開始。 Django僅適用於Web開發數據庫建模。對於非Web環境,其他框架會更好。

+1

我正在使用原則,雖然我承認我仍然不完全理解ORM的概念。我不明白ORM是如何實現的,所以我「不直接設計數據庫關係」。我目前正在MySQL Workbench中研究這個模型,並且通過大量的數據分析來了解我的數據之間的關係。 ORM如何解放我的這個? – StackOverflowNewbie 2011-04-10 00:58:22

2

您可能會出於效率原因使用解決方案二,特別是如果您需要經常選擇這些數量。如果需要,這些值可能是EAV表的「緩存」。你引入了重複但是加快了查找速度。

對於這個問題,EAV是一個很好的解決方案,除非您必須在db級別執行連接。另一種方法是退出關係模型並轉向基於RDF的模型。

0

我已經完成了很多有關EAV模式的工作,它已經足夠好了。我發現空列或動態列(如col1,col2等)很難在事後處理,但查詢它們會更容易,因爲您不需要那麼多連接。

我強烈建議的一件事就是看看像Mongo DB這樣的選項。它會自動處理複雜的動態數據結構。