2009-07-18 66 views
4

我最近繼承了一個嚴重依賴於EAV數據庫結構的系統,並且從性能的角度來看真的很掙扎。nhibernate/orm支持eav嗎?

我想要做的是使用nhibernate或其他合適的ORM產品將這些EAV表映射到實體,以便我們可以將行映射到屬性。然後我們可以重構數據庫以使其成爲關係數據庫。有誰知道這是否可能?一個例子也將不勝感激! :)

爲了給你一個感覺的結構,它看起來是這樣的:

實體(ENTITYID) EntityVarchar(ENTITYID,VarcharValue) EntityFloat(ENTITYID,VarcharValue)

等。如果我有一個Customer實體,我想說Customer.Name來獲取名稱而不是Customer.Varchar [「Name」]。

請注意,在我們的系統中不需要使用EAV模型,我們不允許運行時更改數據結構,我認爲這是一個糟糕的做法。

回答

1

我不認爲這會很容易。雖然有生成器能夠讀取數據庫模式並生成適當的映射和類,但這隻會導致現有eav數據庫的訪問層。要生成這個數據庫的關係版本,你必須讀取數據並創建新的域對象,其中包含你在數據庫中設置的值的屬性。 這很可能會導致一個包含eav db中存在的所有屬性的大表。因此,我認爲更好的方法是通過手動分析現有數據並考慮應用程序的需求來創建關係數據庫模型。特別是表繼承應該是你的朋友在這裏。 然後,在爲兩個模式創建訪問層後,您仍然必須爲數據遷移編寫映射。

+0

使用nHibernate,您可以將實體映射到類中,使其與數據庫模式不是1:1映射,因此您無需將自己牢固地連接到數據庫。 我只是無法看到一個方法,在映射多個行的時刻,每個屬性對應一個對象。通常你會有一行包含單個對象的數據。 – spooner 2009-07-18 10:37:34