数据库设计 - 实体属性值(EAV)的替代方案

3
我要设计一个数据库,用于生产不同类型的产品,每种产品都有自己的参数(数量)。因为我想要将序列号放在一个表中以便查看,所以这些不同的参数会带来问题。
一种解决方案可能是EAV,但它也有缺点,特别是因为我们有大约5个产品,每个产品有大约20,000个序列号(记录)。我觉得这有点过头了...
我不知道怎么设计一个数据库,使得您可以在主表中有一个属性,说:“嘿,你可以在那个详细表中找到这条记录的详细信息”,并且可以轻松地查询结果。
目前我正在使用Visual Basic和Acces 2007,但我将转向Visual Basic和MySQL。
感谢您的帮助。
Bob
请参考如何为许多种产品设计产品表,其中每种产品都有许多参数了解类似的话题。

1
你链接的原始问题没有解决你的问题在哪些方面?看起来你面临着与原帖相同的问题。 - Tony
因为没有关于所谓的类表继承的详细说明,我不知道如何使用JOIN进行查询,其中连接的表名在查询设计时是未知的(因为它是与第一个表进行连接的参数)。 - Bob
1
通过类表继承,您可以将每个产品映射到自己的表,并且在访问数据时必须知道要查询哪个表。我认为类表继承设计中的数据没有“类型”编码。要实现这一点,您需要使用动态SQL,这可能会导致速度问题。 - Tony
嗨,Tony 感谢您的回复! 我所说的20k序列号是指每种产品大约有20000个产品。我同意一个解决方案可能是“知道查询哪个表”。但我不是这些事情的专家,也不确定这是否是“应该”完成的方式。 - Bob
你想存储的不同产品属性有多大差异?我假设(因为你在SO上提出了问题),不可能有一个[ProductGroup]表与其中包含20k行的[Products]表相连? - Tony
显示剩余2条评论
2个回答

1
我会选择像这样的东西:
product [productid, title, price, datecreated, datemodified, etc]
attribute [attributeid, title]
productattribute [productid, attributeid, value, unit]

例子:

[product]
productid  title    price   datecreated  datemodified
1          LCD TV   99.95   2010-01-01   2010-01-01
2          Car      12356   2010-01-01   2010-01-02
3          B/W TV   12.95   1960-01-01   1960-01-01

[attribute]
attributeid  title
10           Colors
11           Dimensions
12           Passengers

[productattribute]
productid  attributeid  value  unit
1          10           16     million
1          11           32     inch
2          12           4      adults
3          10           2      colors
3          11           6      inch

0

看起来你可能需要学习更多关于可用的设计模式,以便在处理这种问题时能够找到最佳解决方案,因为并不存在一种适用于所有情况的通用解决方案。

我建议你阅读《企业应用开发模式》,帮助你更好地理解。很抱歉我无法直接回答你的问题(希望 Stack Overflow 上的其他人可以),但我认为你所链接的问题中给出的答案已经是最好的了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接