Magento数据库结构:EAV (转)

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你就可以找到所有产品的属性,当然也可以所有其它实体的属性了。

思考下下面的查询:
# 找出所有产品的属性
SELECT attribute_code FROM eav_attribute WHERE entity_type_id = 10; 
# 找出单个产品的属性 
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。

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看下你对了没。

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很关键的一部分,因此对于开发者来说,明白它是如何工作的就显的十分重要了。

欢迎一起交流,祝你好运!

源地址:
http://www.vipinit.com/index/article-158.html

本人:很感谢这位同学的研究,作为一个入门,在某个部位深入浅出,写的很好,再次感谢.

Magento数据库结构:EAV (转)相关推荐

  1. Magento数据库结构:EAV

    Magento的表有三百多张,以实体.属性.值(EAV)的数据库结构难以掌握,加上缺少有关EAV的文档,以至许多人不知道这种EAV方式的好处以及它对magento来说的重要性,在这里作为一名magen ...

  2. Magento 数据表结构 EAV模型详解

    EAV : Entity - Attribute - Value的缩写,是数据库模型的一种,使用eav建模的好处是可以动态为数据模型增加或移除属性. 1.问题提出: 假设需要定义一个实体Custome ...

  3. Magento 数据库EVA

    实体,属性和值(EVA)数据库架构排在第一,非常难以把握.EVA结构缺少文档,大部分的人还不知道EVA结构的,对magento都的好处.重要性以及适合性.在这篇文章我要介绍EVA是怎么工作的,为什么他 ...

  4. ECSHOP 数据库结构说明

    ECSHOP 数据库结构说明 (适用版本v2.7.3) 1.account_log 用户账目日志表 字段 类型 Null/默认 注释 log_id mediumint(8) 否 / 自增 ID 号 u ...

  5. C#分析数据库结构,使用XSL模板自动生成代码

    <html> <head> <TITLE>分析数据库结构,自动生成代码</TITLE> <meta http-equiv="Conten ...

  6. 数据库结构Sqlite与CoreData

    改章节是一篇关于数据库结构的帖子 这两个就不是同一个层面的东西,core data是ORM框架+objects graph,它可以选择sqlite,xml,plist或是其他方式作为持久化方案.所以如 ...

  7. 用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Alembic 查看指令 manager db 的可用选项 ...

  8. Oracle-Oracle数据库结构

    再谈Oracle数据库结构 之前写了一篇文章<Oracle-知识结构漫谈> 粗略的介绍了Oracle数据库接口,在这里再更加详细的描述一下,当做是对原有知识的巩固,温故知新. Oracle ...

  9. dede mysql x_认识Dede的mysql数据库结构功能

    数据库是我们深入研究DEDE必须要熟悉的,想必很多朋友都对DEDE的数据库很陌生的,甚至有很多朋友对数据库感到恐惧,全是一些表,感觉什么都看不懂.今天就来和大家详细的分析一下DEDE的数据库结构,写出 ...

最新文章

  1. [学习笔记]矩阵乘法及其优化dp
  2. 执行delete触发器及示例演示
  3. 上下布局:上部分高度自己撑起,下部分高度占满剩下的全部
  4. 【PC工具】大神级代码注释,漂亮实用的代码注释工具代码logo工具
  5. 读书笔记《React引领未来的用户界面开发框架》
  6. 感情沟通出了问题要怎么解决_对待感情最理性的星座,懂得如何沟通,会想办法解决问题...
  7. sqlservcer行列互转
  8. Linux 系统的运行级别(runlevel)
  9. 2017.5.12 校门外的区间 思考记录
  10. 56个免费资源网站,总有你想要的。
  11. java中文转英文_中文转换为英文
  12. Serekh简介:新资产包,埋藏的回忆,第2卷
  13. python123月份名称缩写_月份及其缩写
  14. pack_padded_sequence;pad_packed_sequence
  15. golang操作elasticsearch(oliver/elastic使用文档)
  16. 奇偶校验的快捷判断方法---按位异或
  17. HCIA(HCNA):AAA原理与配置
  18. GreenDao3.0 使用(包括导入,具体方法,基本使用,加密,数据库升级等)
  19. 架构师之路(一) 什么是软件架构
  20. Android 多线程详解

热门文章

  1. python如何登录一个需要第三方验证的网站_python+selenium 之如何跳过登录验证
  2. 为何网站存在漏洞隐患需要做渗透测试服务
  3. 在键盘上输入两个int型数据,比较其大小,并输出其中较小的数
  4. 【2022持续更新】大数据最全知识点整理-HBase篇
  5. 项目经理的能力模型和能力提升的方法
  6. 【App Inventor】飞机大战 APP
  7. Tomcat配置登录拦截功能
  8. RFID应用安全+物联网安全标准
  9. 解题:POI 2009 Lyz
  10. 云计算day12-Kubernetes_K8s