行建模和EAV(实体 - 属性 - 值)之间的主要区别是什么?
我认为EAV是行建模的一个子集,但我不能说明主要的差异。
如果可能,请在答案中使用参考文献。
答案 0 :(得分: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:很多关系(但我不确定所以不要引用我)
实体属性值
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年Babe Ruth本垒打的次数
文章接着说:
下面列出了您需要超越标准行建模到EAV的情况:
- 各个属性的数据类型各不相同(如临床研究结果所示)。
- 数据类别众多,不断增长或波动,但每个类别中的实例(记录/行)数量非常少。在这里,使用传统建模,数据库的实体关系图可能有数百个表:包含数千/数百万行/实例的表在视觉上强调与行数非常少的表相同。后者是转换为EAV表示的候选者。
因此,如果您有很多这些1:多关系,您是否希望每个都有一个表,因为行建模需要?而EAV允许您将这些表(部分或全部)组合成1。