Magento的EAV模型窥探

来源:互联网 发布:绿色和平组织 知乎 编辑:程序博客网 时间:2024/04/29 20:03

EAV : Entity - Attribute - Value的缩写,是数据库模型的一种,使用eav建模的好处是可以动态为数据模型增加或移除属性。 

1. 问题提出: 

假设需要定义一个实体Customer的信息,通常我们只要定义一个表为customer,并定义相应的属性即可。倘若某天需要为customer增加一个新的属性如“毕业学校”,那么就需要更改表的结构。 
如果使用EAV模型则不必改变表结构。 

2. Magento的EAV模型定义: 

在Magento中,EAV模型相关的表定义有: 

eav_attribute           
eav_attribute_group      
eav_attribute_option     
eav_attribute_option_value
eav_attribute_set        
eav_entity              
eav_entity_attribute     
eav_entity_datetime      
eav_entity_decimal       
eav_entity_int          
eav_entity_store         
eav_entity_text         
eav_entity_type         
eav_entity_varchar

现在让我来观察最重要的三张表 
eav_entity_type,eav_entity_attribute,eav_attribute 

1) eav_entity_type表用来定义实体的基本信息。 
mysql>select * from  eav_entity_type whereentity_type_id=1;
+----------------+------------------+-------------------+-----------------+-----------------+
| entity_type_id | entity_type_code | entity_model     |attribute_model | entity_table   |+----------------+------------------+-------------------+-----------------+-----------------+
|            1 | customer        |customer/customer |               |customer/entity |
+----------------+------------------+-------------------+-----------------+-----------------+

2). eav_entity_attribute表用来定义实体customer模型包含哪些属性
mysql> select * from eav_entity_attribute where entity_type_id='1';
+---------------------+----------------+------------------+--------------------+--------------+
| entity_attribute_id | entity_type_id | attribute_set_id |attribute_group_id | attribute_id |
+---------------------+----------------+------------------+--------------------+--------------+
|                 1 |           1 |              1 |               1 |          1 |
|                 2 |           1 |              1 |               1 |          2 |
|                 3 |           1 |              1 |               1 |          3 |
|                 4 |           1 |              1 |               1 |          4 |
|                 5 |           1 |              1 |               1 |          5 |
|                 6 |           1 |              1 |               1 |          6 |
|                 7 |           1 |              1 |               1 |          7 |
|                 8 |           1 |              1 |               1 |          8 |
|                 9 |           1 |              1 |               1 |          9 |
|                10 |           1 |              1 |               1 |         10 |
|                11 |           1 |              1 |               1 |         11 |
|                12 |           1 |              1 |               1 |         12 |
|                13 |           1 |              1 |               1 |         13 |
|                14 |           1 |              1 |               1 |         14 |
|                15 |           1 |              1 |               1 |         15 |
|                16 |           1 |              1 |               1 |         16 |
+---------------------+----------------+------------------+--------------------+--------------+

3),由上表推出customer实体包含16个属性,下面的语句查看每个属性的具体定义 
mysql> select * from eav_attribute where attribute_id<=16 andattribute_id>=1 ;
+--------------+----------------+------------------+--------------+
| attribute_id | entity_type_id | attribute_code  | backend_type |
+--------------+----------------+------------------+--------------+
|           1 |           1 | website_id      | static      |
|           2 |           1 | store_id        | static      |
|           3 |           1 | created_in      | varchar     |
|           4 |           1 | prefix          | varchar     |
|           5 |           1 | firstname       | varchar     |
|           6 |           1 | middlename      | varchar     |
|           7 |           1 | lastname        | varchar     |
|           8 |           1 | suffix          | varchar     |
|           9 |           1 | email          | static      |
|          10 |            1 |group_id        | static      |
|          11 |            1 | dob           | datetime    |
|          12 |            1 |password_hash    | varchar     |
|          13 |            1 |default_billing  | int        |
|          14 |            1 |default_shipping | int         |
|          15 |            1 | taxvat         | varchar     |
|          16 |            1 |confirmation     | varchar     |
+--------------+----------------+------------------+--------------+
所以,使用上述的模型,一旦有CUSTOMER属性定义的添加和删除,只需要增加或删除eav_entity_attribute的记录即可 

3. 使用EAV模型 
现在,在Magento系统注册一个新的用户,看看实例数据如何存放在数据库 
mysql> select * from customer_entity          ;
+-----------+----------------+------------------+------------+--------------------+
| entity_id | entity_type_id | attribute_set_id | website_id |email            |
+-----------+----------------+------------------+------------+--------------------+
|        1 |            1 |             0 |         1 |koda.guo@gmail.com |
+-----------+----------------+------------------+------------+--------------------+

mysql> select * from customer_entity_varchar   ;
+----------+----------------+--------------+-----------+-------------------------------------+
| value_id | entity_type_id | attribute_id | entity_id | value                          |
+----------+----------------+--------------+-----------+-------------------------------------+
|       1 |            1 |          5 |        1 | Koda                          |
|       2 |            1 |          7 |        1 | Guo                           |
|       4 |            1 |          3 |        1 |Default Store View               |
|       5 |            1 |         12 |        1 |2256e441b74ab3454a41c821f5de1e9d:9s |
+----------+----------------+--------------+-----------+-------------------------------------+
从上表看到customer_entity和customer_entity_varchar用来存放相应属性的实际输入值。如: 
Koda,Guo分别属性编号5,7即firstname和lastname实际值 

和customer实体定义相对应的实例存放的相关表包括:
customer_entity         
customer_entity_datetime 
customer_entity_decimal  
customer_entity_int     
customer_entity_text    
customer_entity_varchar  

总结 
了解Magento的EAV模型结构是扩展Magento必须的知识。其意义在于,我们常常需要扩展Magento某些实体的属性,或者创建自定义的eav模型实例。希望本文对你有所启示。

原文转自:百草园博客
0 0
原创粉丝点击