Oracle EAV的数据建模

Oracle EAV的数据建模,oracle,database-design,uml,entity-relationship,entity-attribute-value,Oracle,Database Design,Uml,Entity Relationship,Entity Attribute Value,其他人如何使用关系建模工具将逻辑模型或第三范式的模型映射到使用EAV的数据库?EAV是一种非关系设计。您无法使用EAV实现任何范式,因为它不能成为关系 EAV是反模式的一个例子 如果你需要很多属性,你可以考虑XML并将XML存储在 Culb列中。在关系中,可以有一个EAV(也称为属性值对或名称-值对)。它使用一个相当抽象的数据模型。在描述它之前,有几个警告。它很难查询,而且性能也不好。EAV经常用于关系审计表。EAV存储单个列的前映像(更改前)。它逐个存储更改的列。如果更改了五个属性,那么EAV

其他人如何使用关系建模工具将逻辑模型或第三范式的模型映射到使用EAV的数据库?

EAV是一种非关系设计。您无法使用EAV实现任何范式,因为它不能成为关系

EAV是反模式的一个例子


如果你需要很多属性,你可以考虑XML并将XML存储在<代码> Culb列中。

在关系中,可以有一个EAV(也称为属性值对或名称-值对)。它使用一个相当抽象的数据模型。在描述它之前,有几个警告。它很难查询,而且性能也不好。EAV经常用于关系审计表。EAV存储单个列的前映像(更改前)。它逐个存储更改的列。如果更改了五个属性,那么EAV中将存储五行。此外,由于EAV中可能存在较大的自然主键,因此通常使用镜像表代替EAV

EAV可以在逻辑数据建模和关系数据库中创建。这可以通过三个相关的实体或表来完成:

  • 基本实体(如客户),类似于列族
  • “类型”实体,描述属性及其特征,如净值金额
  • 一种“值”实体,它将属性分配给基础实体的实例并为其提供值
基本实体是具有不同特征的实体

“类型”实体只是一个由类型代码标识的代码表,包含描述和其他域特征。域是指数据类型、长度、含义和度量单位等。它描述上下文之外的属性(即未指定)。例如,净值金额是一个8位数字,小数点后2位,右对齐,其描述为“代表客户财务总价值的值,包括流动和非流动金额”

“值”实体是一个关联实体或表,由客户id和属性类型代码[两个外键]标识,该实体或表具有一个值属性,该属性将净值金额类型分配给客户,并为其提供一个值,如“$2000000”。值列通常具有一个通用名称,如字段

然而,在SQL中,名称-值对有点难以查询,而且通常性能不好。假设“value”实体有一个名为“Field”的属性。这是一个字符串。SQL通常使用列名作为结果集标题。假设该领域有净值。但当它显示时,标题将被称为“字段”,而不是净值。字段是列的实际名称。需要高级SQL才能获得所需的标头。这个问题可以通过将“类型”和“值”实体非规范化为一个实体来解决。没有三个表,而是有两个——一对多,一个基表和一个值表。实际上,Cassandra就是这样做的:列族中的列是一个完全平坦的属性-值对。即使在关系中进行非规范化,“field”列仍然称为“field”

您还可以在关系数据库中将三个实体展平(非规范化)为一个表,但会出现冗余问题:客户ID[FK]、属性类型代码[FK]、客户基础属性、属性类型属性、字段(用于值)。我不是在建议它;我只是说


在数据建模的早期,数据建模者喜欢使用EAV,因为它们看起来是一种优雅、灵活的解决方案——直到DBA开始使用它们。因此,EAV有时用于逻辑模型,但应在物理模型中完全非规范化。当完全非规范化时,它与Cassandra非常相似。我有时在逻辑和物理上都使用过EAV,上面已经指出了一些问题。我不知道如何在这些评论中添加图形,否则我会添加一个插图。

EAV?逃跑!;-)那么,如果你不能使用EAV,那么实现任意列的正确方法是什么呢?使用一个为EAV模型而设计的数据库,而不是关系数据库。如果你描述一下为什么你认为你必须使用任意列,就像比尔的回答一样,我几乎总是这样做。但我会更进一步。我拒绝相信数据库中的每个实体都不共享任何列。即使它们只是一个名称、插入的用户、插入的用户等等。。。提取所有公共字段后,使用XML。@Stephanie Page:+1我同意动态属性的XML(或JSON或YAML或其他类似内容)比使用EAV更可取。我还写了一篇博客,探讨了为什么EAV不能成为关系,评论中的讨论非常热烈:如果需要多用户应用程序,EAV的替代方案是什么,用户可以在何处存储具有自定义属性集的实体?对于其用户,有必要根据自定义属性过滤数据?每个用户的实体数量可能相当高。存储在db字段中的xml或json如何符合标准格式?需要阅读以说明上一段的要点: