行建模和 EAV(实体-属性-值)之间的主要区别是什么?
我认为 EAV 是行建模的一个子集,但我不能说明主要区别。
如果可能,请在您的答案中使用参考资料。
问问题
2170 次
1 回答
2
好问题。
根据维基百科的文章,
行建模和EAV之间的区别是:
- 行建模表在其描述的事实方面是同质的:行项目表仅描述销售的产品。相比之下,EAV 表几乎包含任何类型的事实。
- 行建模表中值列的数据类型由其记录的事实的性质预先确定。相比之下,在 EAV 表中,特定行中值的概念数据类型取决于该行中的属性。
所以这是我的看法:
行建模
create table line_items ( id int primary key, sale_id int, foreign key sale_id references sale(id), product_name varchar(50), -- this could also be a foreign key price decimal(10, 2) );
这有一定的类型安全性:
price
不能是一些垃圾字符串我们在此表中放入的唯一内容是订单项
对我来说,这听起来就像正常的 1:many 关系(但我不确定,所以不要引用我的话)
实体属性值
create table my_eav ( entity_id int, foreign key (entity_id) references entity(id), attribute varchar(50), value varchar(50), primary key (entity_id, attribute) );
这些值存储为
varchar
s - 但它们可以是数字、字符串、时间等。可以存储各种数据——鞋码、飞机重量、贝比·鲁斯在 1926 年击出的本垒打数
文章接着说:
下面列出了您需要超越标准行建模到 EAV 的情况:
- 各个属性的数据类型各不相同(如临床发现所示)。
- 数据的类别众多,不断增长或波动,但每个类别中的实例(记录/行)数量非常少。在这里,使用常规建模,数据库的实体-关系图可能有数百个表:包含数千/数百万行/实例的表在视觉上与只有很少行的表相同程度地被强调。后者是转换为 EAV 表示的候选者。
因此,如果您有很多这样的 1:many 关系,您是否希望每个都有 1 个表,如行建模所要求的那样?而 EAV 将允许您将这些表(部分或全部)组合为 1。
于 2012-10-09T17:42:51.757 回答