Magento是最著名的EAV实现,了解EAV模型原理有助于理解Magento数据存储。

EAV模型是指Entity-Attribute-Value Model,是将传统的关系表中的字段划分为记录分别存储到数据表的模型。实体(entiry)表示所描述的数据项,例如一个产品或汽车。属性(attribute)表示描述实体的数据,例如一个产品将有价格,重量和许多其他属性。值(value)是属性的值,例如产品可能有一个9.99英镑的价格属性。此外值可以基于数据类型进行分割,所以可将EAV表分为字符串、整数、日期和长文本(long text)表。依据数据类型分割是为了支持索引,使得数据库执行可能的类型检查验证。

应用EAV模型时,应考虑以下条件:
数据是稀疏的、异构的,一个实体的属性范围较广,且常引入新的属性。
类的数量非常大,有许多实例类,即使属性是非稀疏的。
有许多混合类,既具有稀疏也具有非稀疏属性。通常情况下,并不是所有的数据类满足EAV建模的要求。

实体描述
一个实体可以是任何条目,到目前为止,所看到的例子是销售事件实体、商人和产品实体。EAV管理的实体是通过一个对象表,用以获取每个项目的共同数据,如名称、说明等。对象表中的每一实体必须具有唯一的标识符,而这通常是自动生成的。然后,该标识符在整个数据库作为外键。

属性描述
属性存储在一个专门的属性表。本表的主键是用来作为跨数据库的参考。的属性表通常辅以多个元数据表,更详细地描述了一个属性。此元数据信息通常用于自动化浏览和编辑数据的用户界面生成。元数据表可能包含如下类型的信息部分:
验证:验证元数据包括属性的数据类型、默认值、值数量的可能限制,以及可否为空(null)。
展现:定义属性如何呈现给用户,是否为文本区域、下拉框或单选按钮/检验框(radio button/checkbox)组。
分组:属性大多呈现在用户群体。 分组中的元数据定义了一个属性的显示方式,提出了属性的数量和什么样的字体和颜色类型使用的顺序。
正常值范围:在某些情况下正常的值范围,可能会随性别、年龄有所不同,等等。

值描述
描述EAV模型值的最简单方法就是将其数据存储为一个字符串。但是,这种方法是相对低效的,因为做任何事与该值相关的事情是都需要进行数据类型转换。此外,对存储为字符串的值创建的索引不允许针对数值型和日期型的搜索范围优化,这是采用混合数据类型的键-值对描述数据的公共问题。
 为改善这种情况,EAV模型为每一数据类型建立单独的表。属性元数据标识正确的数据类型以及随后存储数据的EAV表。这种方法更有效,因为它允许在访问数据之前,缓存给定属性的元数据。