2012-11-18 55 views
0

我需要幫助從包含特定對象(即Products)和其動態屬性的一個表的模型進行查詢。幫助查詢SQL Server 2012中的實體屬性值模型(「動態屬性」)

比方說,我可以一個Chocolate存儲與屬性,如PriceColorWeight也有屬性,如EngineGearsColor一個Car

在我的例子,我有一個叫做產品具有以下幾列表:

Id (Int), 
Name (NVarchar) 

我有另一個表稱爲dynamicAttributes有以下欄目:

Id (int)    -- of the attribute 
ProductId (int)  -- of the specific product 
AttributeType (int) -- enum with the following values ("Color", "Price","Height", "Width"....) 
StringValue -- of the product 
IntValue -- of the product 
DoubleValue -- of the product 
BooleanValue -- of the product 

我從客戶端列表中獲取屬性代碼及其值的列表。

我可以爲每個屬性獲取值類型(aka布爾值,字符串,int)。

從我的應用程序中查詢此模型的最佳選擇是什麼?

僅限動態sqls?使用Pivot關鍵字?

+1

這種設計反模式的名稱是「實體att肋骨值「。搜索它。有很多關於這方面的帖子。 –

+1

真的很糟糕的想法 - 你應該儘量避免使用EAV - 它們看起來像是一個明智的選擇,但是隨着時間的推移,它們將成爲一個巨大的性能和維護噩夢 - 更不用說它需要的非常低效和雜亂的查詢從中獲取任何數據。 .... **不要這樣做!** –

+1

請參閱[避免EAV的破壞(Joe Celko)](http://www.simple-talk.com/sql/t-sql-programming/avoiding-the-eav-of-destruction/),[你應該避免的五個簡單的數據庫設計錯誤(點#3)](http://www.simple-talk.com/sql/database-administration/five-simple--database-design-errors-you-should-avoid/ )和[Bad CarMa](http://www.simple-talk.com/content/article.aspx?article=292)作爲大規模EAV故障的極端示例 –

回答

0

正如其他人所指出的,執行大量的PIVOT查詢效率相當低,而且編寫和調試使用PIVOT的SQL查詢很費力。

另一種方法是以存儲的方式從數據庫中提取數據,即以多行方式提取數據。然後在您的數據庫訪問層中編寫代碼,將這些行按摩到單個對象實例中,併爲每個數據庫行的對象添加一個屬性。這在Martin Fowler出色的企業應用架構模式中被稱爲Table Module pattern

如果您花費一些時間以可重複使用的方式編寫DBAL代碼,您可能會使後續代碼在您的應用程序中讀取並保存存儲在EAV表中的對象變得非常容易。

但是,我同意其他評論者的意見。 I'm generally against using the EAV design。編寫代碼以彌補EAV違反數據庫約定的方式需要很多工作。我想你會有更好的事情來處理你的時間!

替代方案,請參閱: