2012-11-18 53 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违反数据库约定的方式需要很多工作。我想你会有更好的事情来处理你的时间!

替代方案,请参阅: