行建模和EAV之间的区别

时间:2012-05-09 15:44:55

标签: database database-design data-modeling database-schema entity-attribute-value

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

1 个答案:

答案 0 :(得分:2)

好问题。

根据the Wikipedia article

  

行建模和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。