Database design 如何克服从EAV数据库报告的缺点?

Database design 如何克服从EAV数据库报告的缺点?,database-design,architecture,entity-attribute-value,system-design,Database Design,Architecture,Entity Attribute Value,System Design,SQL中实体属性值数据库设计的主要缺点似乎都与能够高效快速地查询和报告数据有关。由于这些问题以及几乎所有应用程序查询/报告的通用性,我读到的关于这个主题的大部分信息都警告不要实现EAV 我目前正在设计一个系统,其中一个实体的字段在设计/编译时是未知的,由系统的最终用户定义。EAV似乎很适合这个要求,但由于我读到的问题,我在实施它时犹豫不决,因为这个系统也有一些相当繁重的报告要求。我想我已经想出了解决这个问题的办法,但我想向SO社区提出这个问题 考虑到典型的规范化数据库(OLTP)并不总是运行报告

SQL中实体属性值数据库设计的主要缺点似乎都与能够高效快速地查询和报告数据有关。由于这些问题以及几乎所有应用程序查询/报告的通用性,我读到的关于这个主题的大部分信息都警告不要实现EAV

我目前正在设计一个系统,其中一个实体的字段在设计/编译时是未知的,由系统的最终用户定义。EAV似乎很适合这个要求,但由于我读到的问题,我在实施它时犹豫不决,因为这个系统也有一些相当繁重的报告要求。我想我已经想出了解决这个问题的办法,但我想向SO社区提出这个问题

考虑到典型的规范化数据库(OLTP)并不总是运行报告的最佳选择,一个好的做法似乎是使用一个“报告”数据库(OLAP),其中来自规范化数据库的数据被复制到其中,并被广泛索引,可能还被非规范化以便于查询。同样的想法可以用来解决EAV设计的缺点吗

我看到的主要缺点是将数据从EAV数据库传输到报表的复杂性增加,因为在EAV数据库中定义新字段时,您可能最终不得不更改报表数据库中的表。但这几乎是不可能的,而且对于EAV设计所提供的更高的灵活性来说,这似乎是一个可以接受的折衷方案。如果我将非SQL数据存储(即CouchDB或类似)用于主数据存储,则也会存在这种缺点,因为所有标准报告工具都希望查询SQL后端

如果您有一个单独的报告数据库进行查询,EAV系统的问题是否会基本消失

编辑:谢谢你到目前为止的评论。我正在研究的系统的一个重要方面是,我实际上只讨论对其中一个实体使用EAV,而不是系统中的所有内容

该系统的全部要点是能够从多个不同的数据源中提取数据,这些数据在时间之前是未知的,并对这些数据进行处理,从而得出关于某个特定实体的一些“最为人所知”的数据。因此,我处理的每个“字段”都是多值的,我还需要跟踪每个字段的历史。这种规范化设计的结果是每个字段有一个表,这使得查询它有点痛苦

下面是我正在查看的表模式和示例数据(显然与我正在研究的有所不同,但我认为它很好地说明了这一点):

EAV表格

Person
-------------------
-  Id - Name      -
-------------------
- 123 - Joe Smith -
-------------------

Person_Value
-------------------------------------------------------------------
- PersonId - Source - Field       - Value         - EffectiveDate -
-------------------------------------------------------------------
-      123 -    CIA - HomeAddress - 123 Cherry Ln -    2010-03-26 -
-      123 -    DMV - HomeAddress - 561 Stoney Rd -    2010-02-15 -
-      123 -    FBI - HomeAddress - 676 Lancas Dr -    2010-03-01 -
-------------------------------------------------------------------
报告表

Person_Denormalized
----------------------------------------------------------------------------------------
-  Id - Name      - HomeAddress   - HomeAddress_Confidence - HomeAddress_EffectiveDate - 
----------------------------------------------------------------------------------------
- 123 - Joe Smith - 123 Cherry Ln -                  0.713 -                2010-03-26 -
----------------------------------------------------------------------------------------
规范化设计

Person
-------------------
-  Id - Name      -
-------------------
- 123 - Joe Smith -
-------------------

Person_HomeAddress
------------------------------------------------------
- PersonId - Source - Value         - Effective Date - 
------------------------------------------------------
-      123 -    CIA - 123 Cherry Ln -     2010-03-26 -
-      123 -    DMV - 561 Stoney Rd -     2010-02-15 -
-      123 -    FBI - 676 Lancas Dr -     2010-03-01 -
------------------------------------------------------

此处的“置信度”字段是使用SQL无法轻松表达的逻辑生成的(如果有的话),因此除了插入新值之外,我最常见的操作将是为所有字段提取有关人员的所有数据,以便生成报告表的记录。在EAV模型中,这实际上更容易,因为我可以执行单个查询。在规范化设计中,我最终不得不对每个字段执行一次查询,以避免大量笛卡尔积将它们连接在一起。

EAV的问题并非由于EAV本身。这是因为在设计和构建数据库时,没有理解数据的真正需求是什么,以及为了满足这些需求,数据必须具有什么样的逻辑结构。EAV,以及任何其他允许用户设计自己数据的系统,都将这一点迎刃而解

在这个方案中,首先我们提出了一个系统,允许用户存储任何类型的数据,无论其结构如何,也不管未来的预期用途如何。然后,当报告出来的时候,我们必须弄清楚我们得到了什么,以及这与我们需要的有什么关系

祝你好运

在这个方案中,首先我们提出了一个系统,允许用户存储任何类型的数据,无论其结构如何,也不管未来的预期用途如何。然后,当报告出来的时候,我们必须弄清楚我们得到了什么,以及这与我们需要的有什么关系

由于你清楚地将问题的性质归因于“在这个计划中”,在我看来,EAV的问题似乎真的是由于EAV本身


事实上,仔细想想,“一个允许用户存储任何类型数据的系统”就相当于一个允许用户定义其relvars的系统。但是,该系统的哪个部分允许用户定义每个属性的约束?哎呀,EAV人群似乎错过了数据管理的一个不那么重要的方面,似乎…

简短的回答-是的,报告数据库是解决EAV数据模型报告问题的合理方法

我花了数年时间研究一个信息管理解决方案,该解决方案允许最终用户完全自由地定义自己的数据模型,模式和数据都使用EAV模型存储。有趣的是,该产品提供了用于满足报告要求的元模式对象(例如,提供对象导航的图形、执行投影的视图等)。这意味着最终用户可以使用他们在第一个实例中用于构建数据模型的相同术语和概念自由定义查询。报告的行为本质上是通过导航这些定义来计算数据集,并将结果交给传统的报告编写工具,就像它是关系数据一样


这种方法的优点之一是,将EAV模型转换为用户可以使用的机制可以重用并应用于报告功能。

EAV没有问题,我花了大量时间从海量EAV数据库查询。