2

行建模和 EAV(实体-属性-值)之间的主要区别是什么?
我认为 EAV 是行建模的一个子集,但我不能说明主要区别。
如果可能,请在您的答案中使用参考资料。

4

1 回答 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)
    );
    
    • 这些值存储为varchars - 但它们可以是数字、字符串、时间等。

    • 可以存储各种数据——鞋码、飞机重量、贝比·鲁斯在 1926 年击出的本垒打数


文章接着说:

下面列出了您需要超越标准行建模到 EAV 的情况:

  • 各个属性的数据类型各不相同(如临床发现所示)。
  • 数据的类别众多,不断增长或波动,但每个类别中的实例(记录/行)数量非常少。在这里,使用常规建模,数据库的实体-关系图可能有数百个表:包含数千/数百万行/实例的表在视觉上与只有很少行的表相同程度地被强调。后者是转换为 EAV 表示的候选者。

因此,如果您有很多这样的 1:many 关系,您是否希望每个都有 1 个表,如行建模所要求的那样?而 EAV 将允许您将这些表(部分或全部)组合为 1。

于 2012-10-09T17:42:51.757 回答