假设我有一个支持实体 - 属性值的数据库模型。如果我有两条记录,每条记录都有多个EAV条目,例如:
苹果
汽车
我可以轻松为Apple制作CSV:
product, size, color
apple, small, green
apple, small, red
apple, large, green
apple, large, red
我也可以为汽车做同样的事。
问题是,如果我想让苹果和汽车在同一个CSV中?我的CSV标题应该是这样的:
product, size, color, type, fuel
但这没有意义。苹果没有汽车类型或燃料。而且汽车没有尺寸和颜色(基于我给出的例子)。
我应该雇用这样的东西:
product
apple, size:small, color:green
apple, size:small, color:red
apple, size:large, color:green
apple, size:large, color:red
car, type:coupe, fuel:diesel
car, type:coupe, fuel:gas
car, type:sedan, fuel:diesel
car, type:sedan, fuel:gas
CSV的消费者只需要知道第一列是表示EAV的名称 - 值对。
什么是好方法?建议吗
答案 0 :(得分:3)
组织EAV的标准方法是:
entity,attribute,value
apple,size,small
apple,size,large
apple,color,green
apple,color,red
car,type,coupe
car,type,sedan
car,fuel,gas
car,fuel,diesel
实体是苹果或汽车,每一行描述该行上实体的一个属性的值。
这不是组织数据的特别好方法。它有一些表面上的优点,但最终会产生复杂的查询。然而,answer中提出的替代设计使生活变得更糟。
假设这是标准电子商务系统中的价格修饰符。我怎么说小红苹果是2美元,而小绿苹果是1美元?
您有两个不同的实体,因此您必须拥有两个不同的实体标识符:
small-red-apple,price,2
small-green-apple,price,1
或者,更常见的是,你有:
entity,attribute,value
1112,name,small-red-apple
1112,type,apple
1112,size,small
1112,color,red
1112,price,2
2223,name,small-green-apple,
2223,type,apple
2223,size,small
2223,color,green
2223,price,1
也就是说,实体1112描述(或 )一个花费2美元的小红苹果,而2223描述(或是)一个花费1美元的小绿苹果。
验证EAV数据变得非常困难。你如何确保当一个实体的“类型”是“苹果”时,“大小”要么是“小”还是“大”,而且颜色要么是“红色”要么是“绿色”(而是“汽车”)可以有“黑色”,“白色”和“蓝色”的颜色吗?您必须非常小心地识别EAV表的每一行中的“实体”,然后识别适用的属性以及属性的适当值范围。你可以使用(单个)EAV表做所有这些,但它会变得混乱。
答案 1 :(得分:0)
这是我要实施的解决方案:
product, name_1, value_1, name_2, value_2
apple, size, small, color, green
apple, size, small, color, red
apple, size, large, color, green
apple, size, large, color, red
car, type, coupe, fuel, diesel
car, type, coupe, fuel, gas
car, type, sedan, fuel, diesel
car, type, sedan, fuel, gas
它可能足够优雅。 CVS的消费者只需要知道名称 - 值对遵循模式" name_x"和" value_x"。当NVP到达第一个" name_x"时,NVP列表结束。和" value_x"那是空的。