2013-01-08 20 views
3

我正在開發一個已經在Nhibernate上運行的應用程序,但我正在考慮使用RavenDb來處理一些我很難在關係數據庫上實現的用例。 (例如,不使用EAV的動態字段)我可以同時支持Nhibernate和RavenDb嗎?

我已閱讀Ayende對this post的推薦。我不確定這是否會長期實用,以及爲支持我的應用程序而需要支持2個數據庫的常見缺陷。

+1

這些動態字段是否可查詢?如果是這樣,那就改變了需求。 –

+0

@JosephDaigle +1非常相關的問題。在決定採用某種方法之前,Jonn對於這些數據在存儲之後想要做什麼有更多想法。如果您想進行復雜的查詢,EAV(或其變體)可能會過度標準化。您可能必須在您的「瘦」表中執行多個連接才能執行復雜的查詢。 (完全符合您的要求)完全動態嗎?有趣的問題,但。我之前沒有看到Ayende的帖子進行過nhibernate/dynamic存儲。 –

+0

它應該可以在一定程度上查詢。數據不會用於任何域邏輯,但可能用於報告目的。我們必須提出一些動態的東西。這是常見的「我們不知道每個客戶需要什麼其他領域,所以我們希望他們能夠自己輸入他們想要的東西」,即EAV試圖解決的問題。 EAV有這麼多陷阱,儘管我不想這次嘗試。 – Jonn

回答

3

在Ayende的鏈接中,他不主張擁有兩個數據庫。僅僅是模式將被擴展,以允許關於實體的附加元數據被存儲在單獨的表中。如果您正在談論的是將混合模式的DA層與部分轉到NHibernate和部分到RavenDB您可能會進入分佈式事務領域 - 這可能是一個顯着增加你的範圍。

你也可以考慮在你的實體的表中添加一個額外的列,以允許你將一個對象串入其中 - 例如它可以是一個字典(你甚至可以使用Json)。如果您之後不需要跨查詢,這對您而言就可以了。如果您在查看特定實體時只需要這些數據,您就可以。

我已經使用這種方法來存儲用戶的偏好。我不需要'查找偏好類別X具有值Y'的所有用戶,我只需要說'告訴我用戶A的所有偏好的所有值'。

編輯 - 存儲XML
對於數據庫中的序列化對象,可以使用xml數據類型。從msdn下面鏈接: -
Implementing XML in SQL Server

這可以達到2GB,所以你不應該用盡空間來存儲大量的動態值。此字段的流暢映射會是這個樣子: -

Map(x=>x.FieldForSerializedThing).CustomType("StringClob") 
            .Column("[FieldForSerializedThing]") 
            .Not.Nullable() 
            .Access.CamelCaseField(Prefix.Underscore); 

的實體將有一個這樣的領域: -

public virtual System.String FieldForSerializedThing 
{ 
    get { return _fieldForSerializedThing; } 
    set { _fieldForSerializedThing = value; } 
} 

我敢肯定還有其他的方法可以做到序列化,但這可以讓你擺脫困境(上面的示例是針對SQL Server的)。

+0

好吧。如果推薦的話,我希望分佈式交易不會比EAV設計的地獄般。去序列化的路徑,這不意味着我將不得不將我的自定義字段限制爲SQL可以支持的最大大小(例如8000個字符)? – Jonn

+0

@John看到我上面的編輯。 –

相關問題