¿Qué es EAV?


Con el fin de entender que es EAV y cuál es su papel dentro de Magento, tenemos que desglosar en partes el modelo EAV.

  • Entity: La entidad representa los elementos de datos (objetos) dentro de Magento como son productos, clientes, categorías y órdenes. Cada entidad se almacena en el base de datos con un identificador único.
  • Attribute: Estos son las propiedades de la entidad. En lugar de tener una columna por atributo en la tabla de productos, los atributos son almacenados en grupos separados de tablas.
  • Value: Como su nombre lo indica, es simplemente el enlace de valor a un atributo en particular.

Este patrón de diseño es el secreto detrás de la flexibilidad y el poder de Magento, permitiendo a las entidades añadir o eliminar nuevas propiedades sin tener que hacer ningún cambio en el código o plantillas.

Considerando que el modelo puede ser visto como una forma vertical de crecimiento de nuestra base de datos (nuevos atributos agregan más filas), en el modelo tradicional implicaría un patrón de crecimiento horizontal (nuevos atributos agregan más columnas) lo que daría lugar a un rediseño del esquema cada vez que se añaden nuevos atributos.

El modelo EAV no sólo permite la rápida evolución de nuestra base de datos, sino que también, es más eficiente, ya que sólo funciona con atributos no vacíos, evitando la necesidad de reservar espacio adicional en la base de datos para los valores nulos.

Si estas interesado en explorar y aprender más sobre la estructura de la base de Magento, te recomiendo que visites www.magereverse.com

Agregar un nuevo atributo a un producto es tan simple como ir al backend de Magento, especificar el nuevo tipo de atributo, ya sea el color, tamaño, marca, y así sucesivamente. Lo opuesto también es cierto, ya que podemos deshacernos de los atributos no utilizados de un producto en particular.

Para obtener más información sobre la gestión de atributos, visite www.magentocommerce.com/knowledge-base/entry/how-do-attributes-work-in-m....

Magento Community Edition cuenta actualmente con 8 tipos diferentes de objetos EAV:

  • Customer
  • Customer address
  • Products
  • Product categories
  • Orders
  • Invoices
  • Credit memos
  • Shipments

Magento Enterprise Edition tiene un tipo adicional llamado elemento RMA, que es parte del Sistema de Autorización de Devolución de Mercancía (RMA).

Toda esta flexibilidad y poder no son gratis, y hay un precio que pagar; la implementación de los resultados del modelo EAV al tener nuestros datos de entidad distribuidos ocupan un gran número de tablas, por ejemplo, sólo el modelo del producto se distribuye en alrededor de 40 tablas diferentes.

El siguiente diagrama muestra sólo algunas de las tablas involucradas en el ahorro de la información de los productos de Magento:

Otra desventaja importante de EAV es la pérdida de rendimiento al tener que recuperar grandes colecciones de objetos EAV y un aumento de la complejidad de las consulta a la base de datos. Dado que los datos estan más fragmentados (almacenados en más tablas), la selección de un único registro implica varias combinaciones.

Vamos a continuar usando productos de Magento como un ejemplo y construir la consulta para recuperar un solo producto manualmente.

Si tienes PHPMyAdmin o MySQL Workbench instalados en el entorno de desarrollo, puedes experimentar con las siguientes consultas. Puedes descargarlos desde PHPMyAdmin (http://www.phpmyadmin.net/) y MySQL Workbench (http://www.mysql.com/products/workbench/).

La primera tabla que vamos a utilizar es catalog_product_entity. Podemos considerar esto como nuestra tabla principal de productos EAV, ya que contiene los principales registros de la entidad para nuestros productos:


Vamos a revisar la tabla ejecutando la siguiente consulta SQL:

SELECT * FROM `catalog_product_entity`;

La tabla contiene los siguientes campos:

  • entity_id: Este es nuestro identificador único del producto y es utilizado internamente por Magento.
  • entity_type_id: Magento tiene diferentes tipos de modelos EAV, productos, customers y orders, y estos son sólo algunos de ellos. La identificación de cada tipo permite a Magento recuperar los atributos y los valores de las tablas de forma correcta.
  • attribute_set_id: los atributos de los productos se pueden agrupar de forma local en conjuntos de atributos. Los conjuntos de atributos permiten aún más flexibilidad en la estructura del producto así el producto no se vea obligado a utilizar todos los atributos disponibles.
  • type_id: Hay diferentes tipos de productos en Magento: simple, configurable, virtual, bundle y grouped, cada uno con la configuración y funcionalidad única.
  • sku: Stock Keeping Unit (SKU) es un número o código utilizado para identificar cada producto de forma única para la venta en una tienda. Este es un valor definido por el usuario.
  • has_options: Este se utiliza para identificar si un producto tiene opciones personalizadas.
  • required_options: Esto se utiliza para identificar si se requiere alguna de las opciones de personalización.
  • created_at: Se trata de la fecha de creación de la fila.
  • updated_at: Esto muestra la última vez que la fila fue modificada.

Ahora tenemos un conocimiento básico de la tabla de entidad de productos, y también sabemos que cada registro representa un solo producto en nuestra tienda Magento, ahora vamos a ver sonde se almacenan los atributos y cómo Magento sabe la diferencia entre un atributo del producto y un atributo de cliente, para esto vamos a echar un vistazo a la tabla eav_attribute ejecutando la siguiente consulta SQL:

SELECT * FROM `eav_attribute`;

Como resultado, no sólo vamos a ver los atributos del producto, sino también los atributos correspondientes al modelo del cliente, modelo de orden, y así sucesivamente. Afortunadamente, ya tenemos una llave para filtrar los atributos de esta tabla. Vamos a ejecutar la siguiente consulta:

SELECT * FROM `eav_attribute` WHERE entity_type_id = 4;

Esta consulta le está diciendo a la base de datos que solo recupere los atributos donde las columnas del producto sean igual a entity_type_id(4). Antes de continuar, vamos a analizar los campos más importantes dentro de la tabla eav_attribute:

  • attribute_id: Este es el identificador único para cada atributo y la clave principal de la tabla.
  • entity_type_id: Este campo se refiere a cada atributo de un tipo de modelo EAV específico.
  • attribute_code: Este campo es el nombre o clave de nuestro atributo y se utiliza para generar getters y setters desde los métodos mágicos.
  • backend_model: El modelo backend gestiona la carga y almacenamiento de datos en la base de datos.
  • backend_type: Este campo especifica el tipo de valor almacenado en el backend (base de datos).
  • frontend_model: El modelo de frontend gestiona la prestación del elemento de atributo en un navegador web.
  • frontend_input: Similar al modelo del frontend, la entrada frontend especifica el tipo de campo de entrada que el navegador debe mostrar.
  • frontend_label: Este campo es la etiqueta / nombre del atributo como debe ser prestados por el navegador.
  • source_model: Se utilizan los modelos de origen para poblar un atributo con valores posibles. Magento viene con varios modelos de origen predefinidas para los países, sí o no los valores, las regiones, y así sucesivamente.

 

Añadir nuevo comentario

CAPTCHA
Esta pregunta es para comprobar si usted es un visitante humano y prevenir envíos de spam automatizado.
4 + 7 =
Resuelva este simple problema matemático y escriba la solución; por ejemplo: Para 1+3, escriba 4.