EAV模型是一种数据模型 ,用于描述实体的数量预计会很大,但事实上,实体中要使用的属性数量并不多。 Magento 2这么设计是为了灵活性,在不影响主干的基础上,任意新增删除属性。 EAV模型(E ->实体,A -> 属性,V -> 值)简单理解就是分表,不需要把所有字段都放在主表里,而是按类型存放在不同的副表上。 对于字段少的项目来说 EAV其实没啥用 效率不高。
按照常规做法,比如一个产品的所有相关属性都会存放在产品表里,增删改查的都是这一个表。 EAV模式 就是把这些属性按照类型独立分开存放到不同表里的。 所有查询属性值的时候会比较麻烦 要联表查询。 不过M2里不用担心,他提供了非常简单的方法,直接get属性名就得到值了,不需要你手动去写sql查表。
实体存储的是数据类型的信息。 就Magento而言,就是Customer,Category,Product等。 属性是每个实体的单独属性(比如name,weight,email)。 值是实体某个属性的值。
比如,产品有个属性叫产地(Manufacture),它的值为中国。 那么产品就是实体,Manufacture就是属性,中国就是值。
EAV模型带来的好处 如下:
- 灵活的多功能数据结构(可以在不更改数据库模式的情况下更改属性数量)。
- 为给定实体添加新属性时,我们有可能在其他实体中使用它
- 快速实施。
EAV实体的数据库模式:
- eav_entity - (E)实体表。
- eav_entity_attribute(A)属性表
- eav_entity_ {type}(V) - 值表。{type} - datetime,decimals,int,text和varchar。
- eav_attribute 里面是所有实体的属性
带有eav_ *表格的图表:
magento的eav模型
Magento 2中有哪些EAV实体? 实体列表可以在eav_entity_type表中找到:
- customer
- customer_address
- catalog_category
- catalog_product
- order
- invoice
- creditmemo
- shipment
Magento 2中有哪些EAV属性类型:
- eav_entity_int
- eav_entity_varchar
- eav_entity_text
- eav_entity_decimal
- eav_entity_datetime
这5种属性类型就相当于字段类型。
- int 对应mysql字段的int类型
- varchar 对应mysql字段的varchar类型
- text 对应mysql字段的text类型
- decimal 对应mysql字段的decimal类型
- datetime对应mysql字段的datetime类型
比如产品的name 是varchar类型。 他的值存在catalog_product_entity_varchar表里。 知道了这个原理,你就很轻松的知道属性和值在哪个表里。 聪明的你会觉得,把属性分散存在不同的表里,如果要查询全部属性的话,要联十几张表,是不是太耗资源了? 这点,M2官方也考虑到了,以产品为例,他提供了catalog_product_flat表,也就是说后台开启flat模式后,查产品数据就直接读取这个表,他把属性都存放在这个表里了。 catalog_product_flat是按store id来分的。如果你有多网店的话。 比如:
catalog_product_flat_1 //代表store id为1的所有产品数据catalog_product_flat_2 代表store id为2的所有产品数据