Nous entendons beaucoup de gens sur internet se plaindre du modèle EAV de Magento. Avant de pouvoir Juger, il faut le comprendre. Je vais donc essayer de vous le montrer d’un point de vue « neutre ».


1) Définition : EAV C’est quoi ?

Entity–attribute–value model (EAV) is a data model to describe entities where the number of attributes (properties, parameters) that can be used to describe them is potentially vast, but the number that will actually apply to a given entity is relatively modest. In mathematics, this model is known as a sparse matrix. EAV is also known as object–attribute–value modelvertical database modeland open schema.

Extrait de wikipedia (5/2/2012) avant validation sur la non-prise de position

En compréhensible, car franchement la définition de Wikipedia n’est pas simple :-). Un modèle EAV est un modèle dans lequel nous déclarons des objets applicatifs sous forme de trois éléments : Une Entité (Un produit Magento par exemple), des attributs (La description par exemple), et des valeurs typées (le lipsum de la description) :-). A l’inverse un modèle type « Flat » lui déclarerait une table (entités) ou chaque attribut serait un champ et la valeur serait la donnée stockée.

Voilà une description neutre…

2) L’EAV dans Magento ?

Magento va encore plus loin que ce principe. En effet, deux séries de tables EAV s’appliquent pour un Objet par exemple de type Produit :

  • Les tables EAV génériques, qui contiennent les attributs « commun » à tous les objets de type EAV.
  • Les tables de spécialisations EAV qui permettent de surcharger les communes avec des informations propres à l’objet (ex type de produit)

3) EAV vs Flat ? Avantages ?

Pour ou Contre le modèle EAV ? Essayons d’être réaliste :

  • Un modèle EAV permet à une application d’être flexible. En effet, le meilleur exemple est la création d’attributs à la volée sur un produit dans Magento. Effectivement, c’est vrai, mais un modèle classique pourrait gérer ce point avec une table d’attributs étendue, ou un simple alter table. Soyons réaliste, nous ne changeons pas les attributs des objets très souvent sur une application de production. Cet argument en fait un point technique qui n’est pas vraiment un avantage du modèle EAV.
  • Le modèle EAV est peu performant. L’éclatement des données utiles en de multiples tables rend obligatoire de nombreuses jointures pour l’extraction d’un simple objet. C’est bien sur LE point faible du modèle EAV.
  • La maintenabilité du système. Ceci est un point assez peu objectif, mais j’ai tendance à penser qu’un modèle plat classique même mal conçu (une petite exception pour le modèle d’un cms connu :-)), va forcément être plus abordable qu’un modèle EAV. Il est très (trop?) compliqué de corriger une erreur dans une table EAV type Magento ou les données peuvent se répartir dans 6 tables (voir plus) sur un même objet.
  • Un typage très faible des données, et des contraintes de bases trop légères pour en assurer l’intégrité métier. Prenons un exemple simple, imaginons un article lié à un objet auteur dans une application que nous stockons dans une base EAV. Comment mettre une contrainte forte entre l’identifiant de l’auteur et l’article écrit… C’est un point important pour la cohérence d’un système.

J’ai beau chercher, je ne trouve pas d’avantage indiscutables, sauf peut-être la flexibilité du modèle EAV. Dans tous les cas, je ne trouve aucune raison justifiant les contraintes de maintenabilités. Je suis sur ce point très ouvert à vos retours…

4) Qu’est-ce que Magento gère en EAV ?

Pour connaitre la liste des objets stockés dans le modèle EAV de Magento, il faut exécuter la requête suivante :

SELECT * FROM `eav_entity_type`

Le résultat est actuellement sur une 1.6.x le suivant :

  • customer
  • customer_address
  • catalog_category
  • catalog_product
  • order
  • invoice
  • creditmemo
  • shipment

Globalement,  les éléments critiques d’une boutique en ligne Magento (Orders, Products, Customers) sont dans les tables EAV.

5) Comment Magento contourne les problèmes de performances, et quand se produisent des problèmes de performances ?

La table EAV n’est pas en réalité si pénalisante pour tous. En fait, le moteur de magento est présent pour cacher d’un côté la complexité des requêtes aux développeurs, et de l’autre il réalise une interrogation relativement intelligente de ces tables pour être le moins pénalisant possible pour les performances.

Les tables EAV deviennent un problème important pour des bases de données contenant de nombreux produits, ou ayant de nombreuses vues produits. Si votre catalogue comporte 500 éléments, l’utilisation de ce modèle n’est pas vraiment grave. Lors de l’utilisation d’un large catalogue, vous comprendrez bien que ce schéma de base devient lourd.

Pour compenser, Magento met à votre disposition un modèle type « flat », les « flat » tables sont générées par Magento, il suffit de les autoriser via la configuration « Admin -> Configuration -> Catalogue -> Frontend » cochez « Utiliser un produit de catalogue fixe » et « Utiliser une catégorie de catalogue fixe ».

L’utilisation des tables « flat » vous permet alors de revenir sur un modèle classique souvent plus performant.

 6) Un modèle d’ORM qui compense ?

Le modèle de Magento de gestion du mapping Objet / Stockage de données, permet de compenser pour les développeurs la complexité de l’EAV. Un effet pervers de la complexité du modèle EAV, est finalement qu’il va obliger les développeurs à ne surtout pas utiliser de requêtes SQL directe (ce que nous ne voyons que trop souvent!!!), au profit du Framework et des méthodes d’interrogations mises à disposition par Magento (ben voilà, un bon point ???J).

7) Conclusion, on reste neutre ou pas ?

Il est compliqué de rester neutre.

Magento ne prévoit pas de retirer le modèle EAV dans ses évolutions. Etant donné la qualité des gens travaillant sur Magento, il doit forcément y avoir de très bonnes raisons quant à l’utilisation d’une base EAV, que j’ignore complétement. Si vous en connaissez, je vous invite à me les faire parvenir via les commentaires.