2010-02-08 51 views
26

我一直在尋找一個數據庫解決方案來允許用戶定義的字段和值(允許無限制的數字)。乍看之下,EAV似乎是合適的,但在讀完一些東西后,我不再確定了。數據庫EAV優點/缺點和替代方案

EAV的優缺點是什麼?

是否有替代數據庫方法允許用戶定義的屬性/字段和值?

+0

見http://stackoverflow.com/search?q=%5bdatabase%5d%20%2beav&tab=newest – 2010-02-09 19:42:51

回答

27

這不是一個詳盡的答案,而只是關於該主題的幾點。

由於該問題也標記爲[sql]標記,讓我說,一般來說,relational databases不適合使用EAV模型存儲數據。您仍然可以在SQL中設計一個EAV模型,但是您將不得不犧牲關係數據庫的許多優勢。您不僅無法強制執行參照完整性,爲值使用SQL數據類型並強制實施強制屬性,但即使是非常基本的查詢也可能變得難以編寫。事實上,爲了克服這個限制,一些EAV解決方案依賴於數據複製,而不是與相關的表格結合,正如你可以想象的那樣,它有很多缺點。

如果你真的需要一個無模式設計,「允許無限數量的屬性」,你最好的選擇可能是使用NoSQL解決方案。儘管EAV相對於關係數據庫的弱點也適用於NoSQL替代品,但您將獲得傳統SQL數據庫難以實現的額外功能。例如,通常NoSQL數據存儲的縮放比關係數據庫容易得多,僅僅是因爲它們被設計用於解決某種可伸縮性問題,並且他們故意丟棄使伸縮變得困難的功能。

許多雲計算平臺(例如,通過AmazonGoogleMicrosoft提供的那些)都設有基於所述EAV模型,其中的屬性的任意數量的可以與給定實體相關聯的數據存儲。如果您正在考慮將您的應用程序部署到雲中,您可能認爲這既是商業優勢,也是技術優勢,因爲大型供應商之間的強勁競爭將價值成本比率推到了非常高的水平,通過不斷推動功能並降低財務和實施成本。

+10

我看不出EAV是如何具有技術優勢的:它的構建,查詢和插入更加複雜,而且可讀性非常低。簡單而快速的「select * from」會變成一個緩慢的怪物sql查詢。我甚至沒有談論試圖根據EAV模型做一些報告。 – guigui42 2010-08-27 08:40:40

+0

@ guigui42:感謝您的評論。你有一個觀點,但我的回答並不是詳盡無遺。儘管如此,由於OP被標記爲已被接受,我已經通過進一步的考慮更新了答案。 – 2010-08-27 09:59:50

+1

我對「執行參照完整性」部分有些困惑。我使用EAV並擁有許多外鍵。由於UNION ALL和一些將數據映射到它們所存儲的表(數據類型)的元數據,可以使用多種SQL數據類型。通過在實體表中添加額外的索引列,可以大大提高查詢速度(例如'type '例如)。 – 2014-01-30 13:59:54

-9

是否有替代數據庫方法允許用戶定義的屬性/字段和值?

一種替代方法是根據用戶輸入更改數據庫模式:例如,當用戶需要新字段時,然後將相應的列添加到數據庫。

+2

這樣做的缺點是,你將有大量的空場 – 2010-02-08 20:13:05

+1

@ChrisW:在我看來,可行的場景非常有限。 – 2010-02-08 20:24:57

+0

一些數據庫支持'稀疏'列(例如SQL Server),這使得這種方法更加可行。 – codeulike 2010-11-19 12:58:32