如何在 CSV 中表示 EAV?

How to represent EAV in CSV?

假设我有一个支持 Entity-Attribute 值的数据库模型。如果我有两条记录,每条记录都有多个 EAV 条目,例如:

苹果

汽车

我可以轻松地为苹果制作 CSV:

product, size, color
apple, small, green
apple, small, red
apple, large, green
apple, large, red

我也可以对汽车做同样的事情。

问题是如果我想让 apple 和 car 在同一个 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 的 name-value 对。

有什么好的方法吗?有什么建议吗?

这是我要实施的解决方案:

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" 和 "value_x" 时结束。

组织 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

实体为apple或car,每一行描述该行实体的一个属性值。

这不是一种特别好的组织数据的方式。它有一些表面上的优势,但最终会导致复杂的查询。然而, 中提出的替代设计让生活变得更糟。


Say this was a price modifier in a standard e-commerce system. How would I say that a Small Red Apple is , but a Small Green Apple is ?

你有两个不同的实体,所以你必须有两个不同的实体标识符:

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 数据变得非常困难。你如何确保当一个实体的'type'是'apple'时,'size'是'small'或'large',颜色是[=39] =] 或 'green'(但是 'car' 也可以有颜色 'black'、'white' 和 'blue')?您必须非常小心地识别 EAV table 的每一行中的 'entity',然后是适用的属性以及属性值的适当范围。您可以使用(单个)EAV table 完成所有这些,但它会变得混乱。