Magento的数据库结构:EVA模式(实体-属性-值)
2014-08-23 17:34
183 查看
Magento的表有三百多张,以实体、属性、值(EAV)的数据库结构难以掌握,加上缺少有关EAV的文档,以至许多人不知道这种EAV方式的好处以及它对magento来说的重要性,在这里作为一名magento开发者,让我们来了解下,它是如何工作的并且对我们有什么好处。 什么是EAV呢?EAV是实体(Entity)、属性(Attribute)、值(Value)的意思,接下来来看看每一部分以便更好的理解它。 实体(Entity)实体指的是magento的数据对象,如产品、分类目录、客户、订单等,每一个实体在数据库中都对应着一条实体记录。 属性(Attribute)属性是指跟实体相关的一些性质数据,如产品实体有名称、价格、状态等。 值(Value)值是最容易理解的了,就是指属性的值了。 EAV是怎么工作的呢?一直以来,数据库其实很简单的,比如我们现在要设计一个商城,需要有一张产品表,包括所有产品的信息,另一张表包括分类信息,也许还要一张表来连接这两张,这样很容易理解吧,然而magento却不一样,它跟产品以及分类有关的表有40多张,要想知道为什么,让我们来看下产品表。 不像其它的商城那样,所有的产品信息在一张表里,magento把产品信息分离在子表中,最顶上的表是catalog_product_entity,如果你看过这张表,你肯定发现了,它只包括产品的一些基础信息,除了SKU,其它你看不到任何有用的信息,幸运地是使用这张表你将可以从属性和值表中看到完整的产品记录。 让我们开始新建一条完整的产品记录,你需要将属性与我们的实体表相关联,做这之前先看下表eav_attribute,这张表在magento里为所有不同的实体存储了所有的属性,打开表,你会看到里面有好几百条不同属性的记录,为什么有些名称还是一样的呢?困惑吧?magento是如何辨别的呢?很快你就会注意到entity_type_id,每一个实体都会有一个entity_type_id,为了找出来,那就再回来catalog_product_entity表,看entity_type_id字段,你会发现所有的记录值都是10,如果你有去看catalog_category_entity,你将会看到一个不同的entity_type_id值。根据这个值和attribute code你就可以找到所有产品的属性,当然也可以所有其它实体的属性了。 思考下下面的查询:Php代码
# 找出所有产品的属性
SELECT attribute_code FROM eav_attribute WHERE entity_type_id = 10;
Php代码
# 找出单个产品的属性
SELECT attribute_code FROM eav_attribute WHERE entity_type_id = 10 AND attribute_code = 'name';
你得到属性和实体了吧。接下来了解下值,值被分离在不同的表中,让我们看下所有前缀是catalog_product_entity的表,值是根据它们的类型来分的,例如,所有的价格以及其它decimal属性的会存储在表catalog_product_entity_decimal中,另外所有文本类型数据会存储在catalog_product_varchar中,需要指出的是每个属性存储的表,magento在eav_attribute表中使用字段backend_type记录,如果你运行以下查询,你将可以找到产品属性'name’的backend type。Php代码
SELECT attribute_code, backend_type FROM eav_attribute WHERE entity_type_id = 4 AND attribute_code = 'name';
希望以上的查询返回的是varchar,这就是name的正确类型啦,基于以上,我们可以知道namer值被存储在表catalog_product_entity_varchar中,你认为下面的查询会存储在哪呢?想一想,然后copy it看下你对了没。Php代码
SELECT e.entity_id AS product_id, var.value AS product_name FROM catalog_product_entity e, eav_attribute eav, catalog_product_entity_varchar varWHERE e.entity_type_id = eav.entity_type_id AND eav.attribute_code = 'name' AND eav.attribute_id = var.attribute_id AND var.entity_id = e.entity_id
为什么使用EAV呢?使用EAV是因为它相比其它普通的数据库结构要更容易扩展。开发者不用编辑核心数据库结构就可以为任何实体添加属性,并且当自定义的属性被添加后,不需要添加任何逻辑让magento保存它,因为这些在模型中都已经存在了,只要数据和属性创建后,模型就会保存了。 EAV有什么缺点呢?最主要的就是它的速度了,由于实体数据都是碎片式的,建立一个完整的实体记录需要许多表联合查询。幸运地是Varien团队开发了个优秀的缓存系统,允许开发者缓存那些不常改变的信息。 另一个问题就是学习的风险,很多开发人员学习到半途就放弃了,对于这还真没有什么捷径,希望我们共同征服它吧! 总结实体、属性、值是很好的一种数据库结构,也是学习magento很关键的一部分,因此对于开发者来说,明白它是如何工作的就显的十分重要了。
# 找出所有产品的属性
SELECT attribute_code FROM eav_attribute WHERE entity_type_id = 10;
Php代码
# 找出单个产品的属性
SELECT attribute_code FROM eav_attribute WHERE entity_type_id = 10 AND attribute_code = 'name';
你得到属性和实体了吧。接下来了解下值,值被分离在不同的表中,让我们看下所有前缀是catalog_product_entity的表,值是根据它们的类型来分的,例如,所有的价格以及其它decimal属性的会存储在表catalog_product_entity_decimal中,另外所有文本类型数据会存储在catalog_product_varchar中,需要指出的是每个属性存储的表,magento在eav_attribute表中使用字段backend_type记录,如果你运行以下查询,你将可以找到产品属性'name’的backend type。Php代码
SELECT attribute_code, backend_type FROM eav_attribute WHERE entity_type_id = 4 AND attribute_code = 'name';
希望以上的查询返回的是varchar,这就是name的正确类型啦,基于以上,我们可以知道namer值被存储在表catalog_product_entity_varchar中,你认为下面的查询会存储在哪呢?想一想,然后copy it看下你对了没。Php代码
SELECT e.entity_id AS product_id, var.value AS product_name FROM catalog_product_entity e, eav_attribute eav, catalog_product_entity_varchar varWHERE e.entity_type_id = eav.entity_type_id AND eav.attribute_code = 'name' AND eav.attribute_id = var.attribute_id AND var.entity_id = e.entity_id
为什么使用EAV呢?使用EAV是因为它相比其它普通的数据库结构要更容易扩展。开发者不用编辑核心数据库结构就可以为任何实体添加属性,并且当自定义的属性被添加后,不需要添加任何逻辑让magento保存它,因为这些在模型中都已经存在了,只要数据和属性创建后,模型就会保存了。 EAV有什么缺点呢?最主要的就是它的速度了,由于实体数据都是碎片式的,建立一个完整的实体记录需要许多表联合查询。幸运地是Varien团队开发了个优秀的缓存系统,允许开发者缓存那些不常改变的信息。 另一个问题就是学习的风险,很多开发人员学习到半途就放弃了,对于这还真没有什么捷径,希望我们共同征服它吧! 总结实体、属性、值是很好的一种数据库结构,也是学习magento很关键的一部分,因此对于开发者来说,明白它是如何工作的就显的十分重要了。
相关文章推荐
- Spring Data JPA 配置数据库表根据实体属性自动创建表结构
- C#中,实体属性与数据库字段的进行反射赋值收藏
- 数据库三级模式体系结构
- 将数据库表结构转化为实体类(适用于vb.net和C#.net)
- magento产品数据库表结构分析[magento二次开发]
- 数据库中的三级模式结构
- 数据库系统体系结构(模式结构)
- Hibernate的注释该如何使用? 属性 数据库中 字段 实体 级联删除
- 关于JPA封装数据库数据到实体不调用属性的get和set的方法解决办法
- magento下订单流程以及订单数据库结构分析
- 数据库——实体框架关系与导航属性
- 数据库系统的三级模式结构
- java 读取properties连接数据库,生成实体、模拟反项工程 由表结构生成实体
- 数据库系统的三级模式结构
- 数据库的三级模式结构的缺陷
- [导入]多层多数据库模式开发的实验(二)实体
- 企业数据库三层结构模型,MVC模式,设计模式,面向对象设计,接口规范及其他
- 数据项、数据字典、模式等基本概念辨析 数据库系统结构
- Hibernate注解插入有空字段实体映射类:实体类有空字段插入数据库时空属性插入为默认值
- 数据库设计之EAV(实体、属性、值)