关系模型与 EAV

Posted

技术标签:

【中文标题】关系模型与 EAV【英文标题】:Relational Model vs EAV 【发布时间】:2016-03-14 22:34:01 【问题描述】:

这里是数据库初学者。

我一直在研究列存储模型,我找到了this paper。它基本上提出了特殊的列存储模型来快速搜索稀疏和庞大的临床数据。

我大体上理解这篇论文的建议,但是关于关系模型和 EAV 模型的一些想法让我感到困惑。该论文假设关系模型甚至不能用于临床数据,并比较了 EAV 和列存储模型的性能。

EAV 可以表示高维数据,因为现有的 RDBMS 仅支持有限数量的列,因此无法通过关系模型对其进行建模。

据我了解this question 及其第一个答案,临床数据是高维的(正如预期的那样),但是

为什么不使用经典归一化而使用 EAV?

关系模型是:

Person: Id, Name, Surname, DateOfBirth, ...
Measurement: Id, Name, Desc, ...
PersonMeasurement: Id, PersonId, MeasurementId, Result, Date

【问题讨论】:

现有 RDBMS 的局限性并不妨碍我们使用关系模型对高维数据进行建模,就像算盘的局限性并不妨碍我们用代数方式表示大数。现有的 RDBMS 甚至没有忠实地实现关系模型。 请注意,您的 PersonMeasurement 表是 EAV 模型,而不是关系数据模型。特别是,Result 列的域取决于 MeasurmentId 的值。关系数据模型会将测量组织为一阶谓词,例如Weight (PersonId PK, Date PK, Kilograms)BloodPressure (PersonId PK, Date PK, Systolic, Diastolic) 等等。 现在我很清楚了,谢谢。不过还有一个问题。在当今的 RDBMS 中,如何将体重和血压表示为真正的关系模型? 我之前的评论已经展示了如何做到这一点 - 为每个不同的规范化谓词制作一个单独的表。 将谓词组合到一个或几个具有可空列的表中进行测量也可以被视为关系型,尽管在“真正的关系模型”中使用空值是有争议的。 【参考方案1】:

...因为现有的 RDBMS 仅支持有限数量的列。

这取决于赋予术语“有限”的含义:典型的现代关系数据库的列数超过 1000。下面是一些最常见的 RDBMS 的最大列数表:

PostgresQL: 250 - 1600 depending on column types
mysql: upto 4096, depending on row size
Oracle: 1000
IBM DB2: 1012
Mycrosoft SQL Server: 1024 - 30000
Sybase: 45000

在您的第二个链接中有以下声明:

关于患者健康状况的数据可以是高维的(100 多个测量/记录的参数,来自血液分析、免疫系统状态、遗传背景、营养、酒精-烟草-药物消耗、手术、治疗、诊断疾病等。 ..)

已编辑

因此,如果列数在数百个数量级,我认为单表方法足以表示临床数据,并且从 *** 上的许多问题中可以看出,查询更高效且更简单比 EAV 模型。

【讨论】:

感谢您的回答。但主要问题是,如果对表进行规范化,则与添加太多列无关。我们将向测量表添加新的测量类型,向 PersonMeasurement 表添加新的测量。这转到三个表和合理数量的列。我不明白为什么有人为每种测量类型创建一个新列? 实际上您提出的关系模式是一种 EAV 模式,但请注意,具有单个表的替代模式不是非规范化模式!而且您始终可以向 RDBMS 中的表添加新列。因此,我认为这两种模式之间的选择取决于有多少属性以及将新度量添加到数据库中的频率。 为什么单表的替代模式不是非规范化的?因为测量是一种个人信息? 是的。测量是人的属性。单表方法是一种规范化方法,因为所有列都依赖于 person 的主键。 @dewe,请注意,如果您想保留某个患者的当前测量值,则可以使用单表方法。如果您想保留患者所有测量的历史记录,您应该使用三表方法。

以上是关于关系模型与 EAV的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的 ORM 和 EAV

实体属性值数据库与严格的关系模型电子商务

EAV模型

数据库 结构 , Eav 模型 , 太慢 的 搜索 查询

树状结构Java模型层级关系Java模型上下级关系Java模型与html页面展示

关系模型关系模型