0

我需要帮助来从包含一个特定对象(即产品)表和一个动态属性表的模型中查询。

假设我可以存储带有Chocolate, 等属性的 a ,也可以存储带有Price, Color,等属性Weight的 a 。 CarEngineGearsColor

在我的示例中,我有一个名为 Products 的表,其中包含以下列:

 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

我从客户那里得到一个属性代码列表和一个值列表。

我可以获取每个属性的值类型(又名布尔、字符串、整数)。

从我的应用程序查询此模型的最佳选择是什么?

仅动态 sql 吗?使用 Pivot 关键字?

4

1 回答 1

1

正如其他人所指出的,执行大量 PIVOT 查询效率非常低,并且编写和调试使用 PIVOT 的 SQL 查询很费力。

另一种方法是以数据的存储方式从数据库中取回数据,即多行。然后在您的数据库访问层中编写代码以将行按摩到单个对象实例中,为每个数据库行的对象添加一个属性。这在 Martin Fowler 的《企业应用程序架构模式》一书中称为表模块模式。

如果您花一些时间以可重用的方式编写 DBAL 代码,您可以让应用程序中的后续代码非常容易地读取和保存存储在 EAV 表中的对象。

但是,是的,我同意其他评论者的观点。 我一般反对使用 EAV 设计。编写代码以弥补 EAV 破坏数据库约定的方式需要大量工作。我认为你有更好的事情来处理你的时间!

有关替代方案,请参阅:

于 2012-11-22T21:42:49.923 回答