2010-12-17 70 views
3

請問請問如何將不同類型的屬性值存儲爲EAV? 我現在看到3個選項。 1.存儲在不同領域的一個表中,如: entity_id attribute_id string_value numberic_value date_value。 2.將不同類型屬性的值存儲在不同表中,例如string_attribute_values,numeric_attribute_values,date_attribute_values。 3.要將所有類型的值存儲爲VARCHAR,但是這個變體看起來不太合適,因爲它很難通過數值進行過濾(它們會比較爲字符串),並且讓我們例如在字段中輸入字母只有數字應該是。如何將不同類型的屬性值存儲爲EAV?

我想我現在需要:字符串,數字小(整數),日期型,但也許其他類型的出現較晚。

謝謝。

+0

方案3也將給您的問題時,來分類,更不用說必須從varchar轉換爲每個值的正確類型的性能命中。我們正在嘗試我們的第一個EAV設計,我們將使用選項2 – Kyle 2011-02-02 17:05:45

+0

我也嘗試使用選項2. – Oleg 2011-03-09 08:00:44

回答

1

在RDBMS社區,EAV是一個反模式。對於使用EAV獲得的「無限靈活性」,將數據重組爲記錄/對象所需的SQL要複雜得多。您還可以獲得無法使用任何可用的數據完整性工具(外鍵,檢查約束等)的「好處」。隨着時間的推移,此設計在自己的重量下崩潰。

如果你有其中的數據元素是超類型/子類型關係的一部分的使用情況,但他們並沒有太大變化,然後根據您的需求模型表:

1)班表繼承=具有公共父項的特定子類型表。當超類型和子類型每個具有大量的獨特屬性時,這是最好的。

2.)混凝土表繼承=放置在每個子類型的表中的公用超類型的列。當超類型沒有很多自己的屬性時,這種效果會更好,但是子類型會有這種效果。

3)單表繼承=地方與超類型的列一起爲所有子類型1個表中的列。不屬於特定行的子類型的列具有NULL值。這適用於每個子類型沒有多個唯一屬性或多個子類型共享列/屬性的情況。

你可以混合和匹配3一點點,但我會建議與設計中的一種堅持。

如果你確實需要使用EAV,您使用XML列在RDBMS中,如果您的數據的一小部分是在你的EAV設計(相對於整個數據庫)。如果很多數據將存儲在EAV中,那麼RDBMS不是您需要的工具。查看文檔/ NoSQL/Key-Value數據庫,如MongoDB,Cassandra等。實施EAV的RDBMS如果不早,最終會成爲編碼的噩夢。

鑑於你的問題的日期,我很好奇,想知道你選擇哪條路線,你學到了什麼,你喜歡什麼/不喜歡等

+0

在我的情況下,類表,contrete表和單表繼承不適用。使用XML也是反模式(即使有1 NF,數據完整性和搜索也存在問題)。現在我嘗試在這個系統中使用EAV的一小部分。對於存儲EAV的值,對於不同類型使用不同的表格:字符串,日期,數字。當然,EAV也會導致一些不合理的情況,但坦率地說,我現在沒有看到其他選擇。我看了一個mongodb,couchdb,並沒有發現它可以幫助我很好地處理我的情況。 – Oleg 2011-03-02 06:35:02

+0

我感謝您的關注。在RDBMS中使用EAV的限制越多,您的長期利益就越好。關鍵是要睜大你的眼睛進入它。還請查看本頁右側相關列表中的一些帖子。那裏有很多意見。 – 2011-03-02 09:20:39

相關問題