【问题标题】:Difference between Row-Modelling and EAV行建模和 EAV 之间的区别
【发布时间】:2012-05-18 04:02:56
【问题描述】:

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

【问题讨论】:

  • 这就是Row Modelling的意思吗?
  • 是的,这是一个很好的定义。
  • 在我看来它们是一回事。是什么让您相信 Row-Modelling 不只是 EAV 的土生土长的名字?
  • 在本文中:(Dinu, V., & Nadkarni, P. (2007)。有效使用生物医学数据库实体属性值建模的指南。国际医学信息学杂志),它们被视为不同的事物。但我无法完全理解其中的区别。
  • @MattFenwick - 完全正确。 Wikipedia 文章进行了区分,但我要说的是,row modelling 一词并没有被广泛使用,实际上大多数从业者在谈论时都在谈论(或 rant)关于 EAV 的 wiki 文章将其描述为 行建模。我不认为你在野外看到“真正的 EAV”——正如维基让我们理解的那样。这导致了一个可能更适合 EL&U 的讨论,即一个术语是否意味着特定权威所说的意思,或者它是否意味着大多数使用它的人所说的意思!

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


【解决方案1】:

好问题。

根据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: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 个中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 2015-02-17
    • 2012-03-07
    • 2022-10-04
    • 2018-11-13
    • 2018-02-08
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多