2009-12-22 39 views
4

我正在考慮使用NHibernate和Fluent NHibernate構建具有可擴展數據模型的電子商務應用程序。通過具有可擴展的數據模型,我可以定義一個Product實體,並允許應用程序中的用戶使用包含自定義數據類型的不同數據類型的新字段/屬性對其進行擴展。如何構建可擴展的數據模型

例如: 產品能有一個像另外字段: 大小 - 詮釋 顏色 - 字符串 價格 - 十進制 收藏ColoredImage的 - 名稱,圖像(例如, 「紅」,red.jpg(二進制文件))

另一個要求是能夠通過這些附加/擴展字段來過濾產品。我應該如何實現這一點?

在此先感謝。

+0

您的意思是說當您說可擴展時可擴展? – 2009-12-25 08:21:14

回答

0

可能的選擇是將所有額外的字段存儲在XML結構中,並使用XPath/XQuery從數據庫中檢索它們。 應用程序中的每個可擴展實體都有一個XML字段,如ExtendedData,它將包含所有額外的屬性。

+0

我確實需要使用NHibernate查詢數據。到目前爲止,我還不知道如何在xml列中使用篩選器進行nh查詢。 – Tim 2009-12-22 09:36:53

1

我認爲這個鏈接描述了一種你想要的...

http://ayende.com/Blog/archive/2009/04/11/nhibernate-mapping-ltdynamic-componentgt.aspx

動態成分的更多信息:

http://www.mattfreeman.co.uk/2009/01/nhibernate-mapping-with-dynamic-component/ http://bartreyserhove.blogspot.com/2008/02/dynamic-domain-mode-using-nhibernate.html

背後動態組件的想法您可以通過沒有將數據庫列與屬性進行一對一映射來構建數據模型。相反,只有一個字典屬性可以包含來自任意數量屬性的數據。通過這種方式,當您獲取實體時,該字典將獲取配置爲屬於其中的所有列的數據。如果您相應更新映射文件(手動或通過應用程序啓動時的代碼),則可以擴展數據庫表的模式以包含更多列,並且這些列將反映到數據庫模型中。

說實話,我不知道你可以使用「屬性」屬性查詢這樣的實體,但如果我不得不猜測我會做一個IN語句。

+0

是的,該鏈接描述如何去映射擴展屬性。但是它並沒有提供更多關於如何構建可擴展數據模型的想法。 – Tim 2009-12-23 02:22:21

+0

以下是關於如何實施可擴展數據模型的一些想法。 ProductExtendedProperty { 字符串鍵 對象值 } ProductExtendedPropertyCollection { 的IList productExtendedProperties } 產品 { ProductExtendedPropertyCollection ExtendedProperties } 我的主要問題是: 如何設計數據庫模型? 如何創建此映射? 我如何使用NH查詢它? 我是否將值存儲在XML列/作爲XML? 如何讓「價值」可搜索? – Tim 2009-12-23 02:28:44

+0

我已更新我的答案以包含更多信息。這是我目前所掌握的,因爲我還沒有用動態組件來了解更多細節。 – tolism7 2009-12-23 09:32:34

1

其中一個選項是EAV模型(實體 - 屬性 - 值)。

這種模式是好的,如果你在你的領域,一個類將導致寬表,表表示(大量列,許多空值)

它最初設計用於醫療領域應用,對象可能有數千個列(sympthoms)。

基本上你

實體(ID)(例如你的產品表) 屬性(ID,的ColumnName) 值(ENTITYID,屬性ID,值)

你可以有一些額外的元數據表。

值應該最好是多個表,一個類型。 例如: ShortStringValue(EntityId,AttributeId,Value nvarchar(50)); LongStringValue(EntityId,AttributeId,Value nvarchar(2048)); MemoValue(EntityId,AttributeId,Value nvarchar(max)); IntValue(EntityId,AttributeId,Value int);

甚至是一個補碼類型: ColorComponentsValue(EntityId,AttributeId,R int,G int,B int);

根據我的經驗,其中一件事是你不應該對所有東西都有EAV。例如,爲一個班級提供EAV。 如果您必須對不同的基類使用可擴展性,請讓它成爲一組獨立的EAV表。

另一件事是你必須爲你的對象發明一個智能實現策略。 不要將這些值轉換爲寬行集合,只爲您的查詢條件需要轉換少量的collumns,然後爲每個選定對象返回一個窄行集合的Value行。否則,pivoting會涉及大量連接。

有幾點需要考慮: 。每個值都需要外鍵的存儲空間 。例如,對於此類查詢,行級鎖定的行爲會有所不同,這可能會導致性能下降。 。可能會導致更大的指數大小。

實際上,在一個淺層世界的測試中,我的EAV解決方案在查詢中的20列表格上的表現優於其靜態對應表,其中4列涉及標準。

0

另一種選擇是使用非關係數據庫,這些數據庫通常適用於這類事情。數據庫(couchDB,mongoDB,cassandre ...)可讓您動態定義您的propretyfields,您可以隨時將字段添加到您的產品類中。

0

我正在尋找類似的東西,結果發現N2 CMS(http://n2cms.com),它以相當實用的方式實現了域的可擴展性。它還支持查詢擴展字段,這很重要。我發現唯一的缺點是它使用HQL實現,因此需要一些時間來重新實現它才能使用QueryOver/Linq進行查詢,但主要想法和映射都在那裏。看看ContentItem,DetailCollection,ContentDetail類,它們的映射和QueryBuilder/DetailCriteria。