Base de données Magento : comprendre le modèle EAV

  • De le 25 juillet 2012
  • Difficulté : 1/4

Base de données Magento : comprendre le modèle EAV Le modèle de base de données EAV peut paraître un peu difficile à appréhender. Il existe peu de documentation sur cette architecture particulière. Pourtant, bien adapté, ce modèle se révèle extrêmement puissant.

Qu'est ce que le modèle EAV ?

Le sigle EAV signifie Entity, Attribute, Value, soit Entité, Attribut, Valeur en Français.

Entité : Une entité représente un élément, pour Magento c'est un produit, une catégorie, un client ou encore une commande.

Attribut : Les attributs sont les champs associées à une entité. Par exemple, l'entité produit possède des attributs comme le nom, le prix, la description ou le statut.

Valeur : Il s'agit simplement de la valeur d'un attribut.

Si nous prenons une entité de type produit, nous obtenons :

  • Entité : Produit
  • Attribut : Nom
  • Valeur : iPad 2 WiFi 16 Go noir

Comment fonctionne le modèle EAV ?

Si vous deviez concevoir une application e-commerce, vous auriez certainement construit une table contenant l'ensemble des informations produits, une autre pour les informations relatives aux catégories et une dernière pour relier les deux. Une structure classique de ce type reste facile à maîtriser.

Tables relation simple

Magento lui, présente plus de 40 tables pour le simple enregistrement des données produits et catégories.

Tables relation EAV

Prenons comme exemple l'entité de type produit, plutôt que de stocker toutes les informations dans une seule table, Magento les répartie dans ce que l'on appelle des sous-tables.

La table principale est catalog_product_entity. Si vous l'analysez, vous constatez qu'elle ne contient que des informations de base.

Structure de la table catalog_product_entity

Pour récupérer la totalité des données associées au produit, nous avons besoin de lier l'entité produit à ses attributs. Regardez la table eav_attribute. Cette table est utilisée pour stocker les attributs de toutes les entités. Notez qu'elle contient des centaines d'attributs, certains possèdent le même nom, par exemple "name".

Comment Magento différencie-t-il l'attribut "name" d'un produit et l'attribut "name" d'une catégorie ?

Tout simplement par la colonne entity_type_id. Dans la table catalog_product_entity, la valeur de entity_type_id est toujours 4, c'est l'identifiant défini pour l'entité de type produit. Si nous regardons la table catalog_category_entity, nous trouvons cette fois ci la valeur 3.

Avec cet identifiant, nous pouvons charger tous les attributs associés à l'entité produit :


# Sélectionner les attributs produit
   SELECT attribute_code FROM eav_attribute
   WHERE entity_type_id = 4;
 
# Sélectionner un attribut produit spécifique
   SELECT attribute_code FROM eav_attribute
   WHERE entity_type_id = 4 AND attribute_code = 'name';

Maintenant que nous savons lier une entité à ses attributs, il nous faut récupérer les valeurs. Les valeurs sont réparties dans plusieurs tables, Le préfixe de ces tables pour un produit est toujours catalog_product_entity_XXXXX.

La répartition des valeurs dans les sous-tables dépend de son type. Par exemple, le prix sera stocké dans la table catalog_product_entity_decimal. Les chaînes de caractère comme le nom seront stockées dans la table catalog_product_entity_varchar.

Pour trouver la table dans laquelle les valeurs d'un attribut sont stockées, il suffit de regarder la colonne backend_type de la table eav_attribute.


SELECT attribute_code, backend_type FROM eav_attribute
WHERE entity_type_id = 4 AND attribute_code = 'name';

Cette requête nous retourne comme backend_type pour l'attribut "name" : varchar. Nous déterminons alors que la valeur est présente dans la table catalog_product_entity_varchar.

Considérons la requête suivante :


SELECT entity.entity_id AS product_id, value.value AS product_name
FROM catalog_product_entity entity, eav_attribute attribute, catalog_product_entity_varchar value
WHERE
   entity.entity_type_id = attribute.entity_type_id
   AND attribute.attribute_code = 'name'
   AND attribute.attribute_id = value.attribute_id
   AND value.entity_id = entity.entity_id

Cette requête affichera le nom du produit et son identifiant. Voilà comment reconstituer l'ensemble des données associées à une entité de type produit.

Une requête classique sur une collection de produit ressemble à ceci :


SELECT `e`.*, `_table_weight`.`value` AS `weight`, `_table_price`.`value` AS `price`, IFNULL(_table_name.value, _table_name_default.value) AS `name`
FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_product_entity_decimal` AS `_table_weight` ON (_table_weight.entity_id = e.entity_id)
AND (_table_weight.attribute_id='65') AND (_table_weight.store_id=0) INNER JOIN `catalog_product_entity_decimal` AS `_table_price`
ON (_table_price.entity_id = e.entity_id) AND (_table_price.attribute_id='60') AND (_table_price.store_id=0)
LEFT JOIN `catalog_product_entity_varchar` AS `_table_name_default` ON (_table_name_default.entity_id = e.entity_id) AND (_table_name_default.attribute_id='56') AND _table_name_default.store_id=0
LEFT JOIN `catalog_product_entity_varchar` AS `_table_name` ON (_table_name.entity_id = e.entity_id) AND (_table_name.attribute_id='56') AND (_table_name.store_id='1')
WHERE (_table_weight.value >= 1) AND (_table_price.value >= 5 and _table_price.value <= 200) ORDER BY `name` asc

Le diagramme complet de la base de données de Magento est accessible sur Magereverse.

Magereverse

Pourquoi utiliser un modèle EAV ?

Le modèle EAV est utilisé car il est beaucoup plus souple et évolutif qu'un modèle de base de données habituel. Nous pouvons ajouter indéfiniment des attributs sans jamais modifier la structure même de la base (ALTER TABLE par exemple n'est jamais utilisé).

Quels sont les inconvénients du modèle EAV ?

L'inconvénient majeur du modèle EAV est sa vitesse. La répartition des données impose un nombre conséquent de jointure lors d'un enregistrement ou d'une sélection.

Le deuxième inconvénient reste la compréhension générale de la base par un développeur novice souhaitant s'initier à Magento. Les 327 tables ont fait fuir beaucoup de monde.

Comment Magento contourne l'inconvénient majeur du modèle EAV ?

Pour palier au problème de performance, Magento a imaginé un système de FLAT. Le FLAT rassemble au sein d'une même table l'ensemble des données. Magento offre donc la souplesse d'un modèle EAV associé à la rapidité d'un modèle de base classique !

De plus, le système de cache permet d'éviter l'exécution répétées des mêmes requêtes. Pour les données n'évoluant pas ou peu, le cache permet de s'exempter des requêtes.


Source : fishpig.co.uk - traduit, romancé, complété et illustré par Magentix

commentaires

Commentez cet article : Base de données Magento : comprendre le modèle EAV