什么是eva
eva代表实体,属性和值。让我们看看它的每一部分,试着更好的了解它。
实体
实体代表等产品,种类,客户和订单magento的数据项。每个实体(产品,类别等)都会有它的数据库中的实体记录。
属性(attribute_code)
该属性表示数据项属于一个实体。例如,产品实体,如名称,价格,地位和更多的属性。
值
该值是最简单的理解,因为它是简单地链接到一个属性的值。
为了更好地理解这一点,让我们考虑产品的实体。每个产品的实体将有一个属性,一个是属性名称系列。每一种产品将有一个属性名称值(和所有其他属性)。
eva是怎么工作的 ?
让我们用一个产品表作为例子。比起将所有的数据存取在一个表格中,magneto将信息分开存储在多张表格中。
在这种层次结构的顶部表是 catalog_product_entity. 如果你在phpmyadmin看看这个表,你会看到它包含了产品的简单基本资料,也没有出现任何有用的信息,包括sku!幸运的是,使用此表是有可能建立从属性和值表的完整的产品记录。
要开始构建一个完整的产品记录,您将需要开始加入到产品实体的属性表。你这样做之前,看一下名为eav_attribute的表。eav_attribute是存储属性的主要表,用于存储所有不同的实体的属性(产品,客户,订单,分类等)。magento的怎么知道哪一个属性属于一个产品,或者属于一个类别?由于通常是与magento情况下,每一个实体 (产品,客户,订单,分类等) 都有一个 entity_type_id.要了解这一点,回去 catalog_product_entity 查找entity_type_id 这个字段.在该表中每个记录的值应该是4,因为这已被列为指定产品entity_type_id。如果你看看 catalog_category_entity你将看到另一个不同的 entity_type_id。使用这个值和属性代码,它可以为一个产品或任何实体加载属性。找到attribute_code对应的attribute_id和backend_type,如果backend_type不为空,就是用的catalog_category_entity_{backend_type}表,为空就是catalog_category_entity。通过attribute_id,catalog_category_entity中的entity_id可以找到莫一条纪录的值
为什么要使用eva?
eav 是因为它比一般规范化的数据库结构扩展性更好。开发人员无需修改数据库结构的核心就可以为任何实体(产品,品类,客户,订单等)添加属性。当建立一个自定义属性的时候,不用为保存这个属性去建立逻辑结构,因为它已经被建立到数据库模型中;只要数据集和属性已经建立,该模型将被保存!
eav的缺点是什么?
eav一个主要缺点是它的速度。因为实体数据如此支离破碎,创造了整个实体记录需要大量的表联接。幸运的是,在瓦瑞恩团队有一个很好的缓存系统实施,允许开发者缓存不经常改变的资料。
eav的另一个问题是它学习有曲线性, 这样很多初级开发人员在了解到它的的简单之前就已经放弃了。虽然没有此快速修复,希望这篇文章将有助于人们开始解决这个问题。
结论
实体,属性,价值是一个伟大的数据库结构,是magento成功的一个关键部分,开发人员了解如何运作是非常重要的。这方面的知识也有很多应用,我相信如果你的magento工作时间足够长,你会碰到一些!

select `e`.entity_id as customer_id,`e`.email,_table_billing_name.value as realname,_table_billing_addree.value as address,
_table_billing_province.value as province,_table_billing_city.value as city,_table_billing_postcode.value as postcode
from `customer_entity` as `e`
left join `customer_entity_int` as `_table_default_billing` on (`_table_default_billing`.`entity_id` = `e`.`entity_id`) and (`_table_default_billing`.`attribute_id` = '7')
left join `customer_address_entity_varchar` as `_table_billing_name` on (`_table_billing_name`.`entity_id` = `_table_default_billing`.`value`) and (`_table_billing_name`.`attribute_id` = '9')
left join `customer_address_entity_varchar` as `_table_billing_postcode` on (`_table_billing_postcode`.`entity_id` = `_table_default_billing`.`value`) and (`_table_billing_postcode`.`attribute_id` = '14')
left join `customer_address_entity_varchar` as `_table_billing_province` on (`_table_billing_province`.`entity_id` = `_table_default_billing`.`value`) and (`_table_billing_province`.`attribute_id` = '12')
left join `customer_address_entity_varchar` as `_table_billing_city` on (`_table_billing_city`.`entity_id` = `_table_default_billing`.`value`) and (`_table_billing_city`.`attribute_id` = '15')
left join `customer_address_entity_text` as `_table_billing_addree` on (`_table_billing_addree`.`entity_id` = `_table_default_billing`.`value`) and (`_table_billing_addree`.`attribute_id` = '16')