0

我需要你的帮助。

我正在创建一个电子商务网站,但我遇到了产品规格问题。

我有以下表格

项目

ItemID    (1231)
ItemName  (Dell Inspiron)

眼镜

SpecID    (5342)   (5343)
ItemID    (1231)   (1231)
SpecName  (HDD)    (MEM)
SpecValue (500GB)  (4GB)

括号中的值是表格行。

这是将规格存储在数据库中的最佳方式吗?

以后怎么查询?可以说我需要所有带有HDD=500GBand的产品MEM=4GB

是否可以从 C# (asp.net) 中的数据库中读取它作为Items具有子对象的对象Specs

有没有办法将所有规格组合在Items按 分组的一行中ItemID

提前致谢。

4

2 回答 2

4

您所暗示的内容称为 EAV (Entity-Attribute-Value)。您可以阅读链接的 Wiki,并且知道要查找的内容应该让您开始进一步挖掘并找到针对特定 EAV 相关问题的 C#/EF/Linq/ASP.Net 解决方案。

一些很好的讨论将在这里,例如。实体属性值数据库与严格的关系模型电子商务问题

SQL Server CAT 团队提出了性能和可扩展性语义数据建模的最佳实践,必读。

于 2013-11-06T20:39:05.407 回答
1

这是将规格存储在数据库中的最佳方式吗?

看起来 Item 和 Spec 具有多对多的关系。所以更好的设计应该是这样的:

项目(项目 ID PK,项目名称)

ItemSpecs(ItemId, SpecId, SpecValue)

规格(规格 ID PK,规格名称)

以后怎么查询?假设我需要 HDD=500GB 和 MEM=4GB 的所有产品?

SELECT i.* FROM Items i, ItemSpecs is1, Specs s1, ItemSpecs is2, Specs s2
WHERE i.ItemId = is1.ItemId
AND is1.SpecId = s1.SpecId
AND s1.SpecName = 'HDD'
AND is1.SpecValue = '500GB'
AND i.ItemId = is2.ItemId
AND is2.SpecId = s2.SpecId
AND s2.SpecName = 'MEM'
AND is2.SpecValue = '4GB'

但是,通常您已经知道要查询的 SpecId,因此您不需要 Specs 上的联接。

是否可以从 C# (asp.net) 中的数据库中将其作为具有子对象 Specs 的对象 Items 读取?

我不确定你的意思。

有没有办法将所有规格组合在一个按 ItemID 分组的 Items 行中?

仅当您提前知道规范的数量或动态构建查询时。规格越多,该行的列就越多。

于 2013-11-06T20:48:29.763 回答