Modelo EAV en Magento

por David Abad
Modelo EAV en Magento

Magento implementa un patrón EAV (entidad-atributo-valor) en el modelo de datos de productos, categorías, clientes… Este patrón aporta ventajas y escalabilidad, pero aumenta notablemente la complejidad.

En este artículo se va a detallar en que consiste este patrón de base de datos, cómo se está aplicando actualmente en Magento, así como las ventajas y desventajas que aporta.

Modelo EAV

El modelo EAV también conocido como modelo vertical o esquema abierto, consiste en una estructura de base de datos en la que los atributos no son representados como diferentes columnas de una misma tabla, sino que se basa en el uso de diferentes tipos de tabla:

  • Entidad: Tabla que almacena los diferentes items de la entidad (una fila por item).
  • Atributo: Tabla que almacena los diferentes atributos disponibles para una entidad.
  • Valor: Tabla que almacena el valor de cada atributo para cada item.  

El siguiente diagrama muestra la diferencia entre el modelo de almacenamiento tradicional y el modelo EAV:

Modelo tradicional vs Modelo EAV

Modelo tradicional vs Modelo EAV

Modelo EAV en Magento

Magento implementa el patrón EAV en los modelos de datos de algunos módulos relevantes:

  • Customer
  • Customer address
  • Catalog Category
  • Catalog Product

Para facilitar la explicación de la implementación de este modelo EAV en Magento, a continuación se muestra el diagrama de las tablas implicadas en el caso concreto de la entidad de producto. Pero la estructura es equivalente para el resto de entidades que siguen este esquema de datos.

Modelo EAV: Catalog Product

Modelo EAV: Catalog Product

Como se puede ver en el diagrama anterior, existen una serie de tablas que son comunes a todos los tipos de entidad que siguen el patrón EAV:

  • eav_attribute: Listado de los atributos disponibles, su tipo de valor, el tipo de entidad al que aplican y otras propiedades. 
  • eav_attribute_label: Etiquetas de los atributos especificas de cada store.
  • eav_attribute_set: Sets de atributos disponibles para cada tipo de entidad.
  • eav_attribute_group: Agrupaciones de atributos dentro de cada set.

 Otras tablas son especificas según cada tipo de entidad. En el caso de los productos, se cuenta con una tabla principal “catalog_product_entity” donde se almacena la información esencial de los diferentes productos, correspondiendo cada fila a un producto diferente. El resto de atributos se almacenan en tablas separadas según el tipo de su valor y permitiendo diferentes valores por store:

  • catalog_product_entity_int
  • catalog_product_entity_varchar
  • catalog_product_entity_datetime
  • catalog_product_entity_text
  • catalog_product_entity_decimal
Los atributos pueden ser de diferentes tipos primitivos (int, varchar, datetime, text, decimal), pero también pueden definirse como tipo “static” para que sean incorporados como parte de la tabla principal (catalog_product_entity).
 

Por defecto, estos atributos pueden tener valores libres mientras respeten el tipo de dato establecido. Pero también existe la posibilidad de definir una lista predefinida de valores que puede tomar cada atributo, de modo que pueda ser mostrado en forma de selector de opciones. Para almacenar las diferentes opciones que puede tomar cada atributo, Magento utiliza las siguientes tablas:

  • eav_attribute_option
  • eav_attribute_option_value
  • eav_attribute_option_swatch

Por otro lado, tambien existen tablas de propiedades de atributo específicas por tipo de entidad. En el caso de los productos y categorías, se utiliza la tabla catalog_eav_attribute para determinar propiedades como:

  • is_visible
  • is_searchable
  • is_filterable
  • is_comparable
  • is_visible_on_front

Ventajas y desventajas del modelo EAV

El modelo EAV aporta numerosas ventajas en cuanto a escalabilidad y mantenibilidad de los atributos y los datos:

  • Permite almacenar un gran número de atributos para cada entidad.
  • Permite añadir, editar y eliminar atributos sin modificar la estructura de la base de datos.
  • Permite almacenar diferentes valores para una misma propiedad de un item en distintos scopes (stores).
  • Permite almacenar facilmente propiedades y etiquetas para cada atributo.

Es muy importante destacar que las bases de datos MySQL cuentan con un límite de 4096 columnas por tabla, por lo que un modelo de almacenamiento tradicional está muy limitado respecto a un modelo EAV que no cuenta con ninguna limitación de este tipo.

A pesar de las ventajas que proporciona un modelo de almacenamiento EAV, también cuenta con la desventaja de la gran complejidad que añade al esquema de datos, forzando a realizar un gran número de JOINs para obtener la información deseada. 

Este aumento de complejidad en el esquema de datos, puede traducirse en un peor rendimiento a la hora de consultar datos. Para mitigarlo, Magento incorpora una serie de tablas “flat” intermedias que son pobladas de forma automática mediante indexadores que recolectan los datos del esquema EAV y lo persisten siguiendo un modelo de datos tradicional.

Mediante el uso combinado del modelo EAV y las tablas flat pobladas mediante indexadores, Magento aporta la escalabilidad y mantenibilidad de un esquema EAV sin renunciar a la eficiencia del modelo de almacenamiento tradicional.

Déjanos tu email para recibir contenido interesante en tu bandeja de entrada, cada mes.

¡No hacemos spam!

Otros artículos