EAV de Magento 2: descripción general de las estructuras de datos

En esta publicación, revisaré las estructuras de datos de Magento 2 que admiten un concepto como EAV . Los desarrolladores a veces necesitan salir de la naturaleza del código y tratar de examinar sus lugares de vida desde la altura del vuelo de un águila; esto le permite concentrarse en cosas que son realmente importantes o simplemente grandes. Entonces salí.


imagen


El acrónimo EAV se revela como Entidad - Atributo - Valor (esto es para aquellos que no siguieron el enlace anterior). El principal " plus " de EAV es el uso eficiente del espacio de la base de datos en casos donde el número posible de diferentes atributos (propiedades, parámetros) que se pueden usar para describir cosas (entidades) es muy amplio, pero el número de atributos, que en realidad se refiere a El objeto individual es relativamente pequeño. Un buen ejemplo de tal caso en el comercio electrónico es el concepto de "producto": los atributos significativos de los productos " TV " (tamaño de pantalla) difieren de los atributos significativos de los productos " saco de dormir " (temperatura mínima confortable).


Entonces, ¿qué ofrece Magento 2 para almacenar datos en formato EAV?


espacio de nombres 'eav_'


En la base de datos Magento 2.3 eav_ , hay 21 tablas con el prefijo eav_ . Todos ellos se pueden dividir en tres grupos:


  • eav_attribute
  • eav_entity
  • eav_form

La forma más fácil es con eav_form : estas tablas se relacionan con la visualización de algunos datos EAV en la interfaz de usuario y no se relacionan directamente con la ubicación de los datos EAV en la base de datos (considero solo estructuras de datos y solo desde el punto de vista del almacenamiento de información, no su visualización). Para el experimento, eav_form las eav_form espacio eav_form de la base de datos y esto no me impidió hacer un pedido en la tienda. Por lo tanto, aún debe buscar dónde se usan los datos de este espacio de tabla y cuánto se necesita para que Magento funcione.


De los dos restantes, el grupo eav_attribute refiere a la letra A (ttribute) , y el grupo eav_entity a la letra E (ntity) . ¿Dónde está la letra V (alue) ?


Los valores para los atributos de entidad deben buscarse en los sufijos de nombre de tabla:


  • _datetime
  • _decimal
  • _int
  • _text
  • _ varchar

Puede ver las tablas que comienzan con:


  • catalog_category_entity_
  • catalog_product_entity_
  • customer_address_entity_
  • customer_entity_
  • eav_entity_

Una simple multiplicación del número de sufijos (5) por el número de prefijos (5) nos da el número total de tablas (25) en las que se supone el almacenamiento de datos de valores .


'eav_entity_type': registro de tipo de entidad


El comienzo de EAV en Magento debe encontrarse en la tabla eav_entity_type . Es aquí donde se establecen qué tipos de valores de atributos de entidades se almacenarán en la estructura EAV. Entonces, inicialmente Magento 2.3 ofrece esta opción para las siguientes ocho entidades:


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

'eav_attribute': registro de atributos


El siguiente paso es descubrir qué atributos pueden caracterizar estos tipos de entidades. Esta información está en la tabla eav_attribute . El registro de atributos tiene un cierre en el registro de tipos de entidad por clave externa . En el registro de atributos, inicialmente 135 entradas pertenecientes a 4 tipos de entidades:


  • customer
  • customer_address
  • catalog_category
  • catalog_product


    ¿De qué está hablando esto? Bueno, al menos ese otro tipo de entidades:


  • order
  • invoice
  • creditmemo
  • shipment

No use la estructura EAV para almacenar datos. Es decir, en algún momento, el entusiasmo estaba presente y el uso de EAV fue planeado para ocho tipos de entidades, pero de hecho se detuvieron en 4.


'eav_entity_': espacio fantasma


El eav_entity tabla eav_entity se asemeja a las ciudades fantasmas chinas: de 9 tablas espaciales, solo dos contienen datos:


  • eav_entity_type : este es un registro de tipos de entidad que mencioné anteriormente;
  • eav_entity_attribute : se usa para organizar los atributos en grupos (más cerca de la visualización de datos que de su almacenamiento); esta información se relaciona más directamente con los atributos en sí mismos que con las entidades (es decir, obviamente no de esta parroquia, tiene un lugar en el espacio eav_attribute_ );

Las 7 tablas restantes están vacías:


  • eav_entity
  • eav_entity_datetime
  • eav_entity_decimal
  • eav_entity_int
  • eav_entity_store
  • eav_entity_text
  • eav_entity_varchar

Es muy similar a tratar de unificar la forma de almacenar valores para atributos de entidad en un conjunto de tablas ( datetime y datetime , decimal , int , text , varchar ) en lugar de tener 5 tablas con los sufijos correspondientes para cada tipo de entidad. ¿En un intento fallido? ¿O es el futuro de EAV en Magento?


imagen


Como sea La tierra estaba sin forma y vacía, y la oscuridad estaba sobre el abismo, y el Espíritu de Dios. Estas tablas no se utilizan inicialmente.


Tipos de valor de atributo


eav_entity_type tipos de eav_entity_type se establecen en la tabla eav_attribute , eav_attribute los atributos mismos y su enlace a los tipos de entidad correspondientes se establecen en la tabla eav_attribute . ¿Y cómo determinar dónde buscar el valor para dicho atributo de dicha entidad?


El campo eav_attribute.backend_type nos ayudará con esto. Muestra dónde se almacenan los valores de los atributos:


  • estático : en la tabla con datos sobre la propia entidad (por ejemplo, los valores para el atributo # 9 - customer.email , debe buscar en la tabla customer_entity en la columna de email );

Para los tipos restantes, los valores se almacenan en tablas separadas, en cuyos nombres el prefijo corresponde al tipo de entidad ( customer_ , ...) y el sufijo a uno de los tipos de datos:


  • datetime
  • decimal
  • int
  • text
  • varchar

Es decir, los valores para el atributo # 79 catalog_product.special_from_date tipo datetime se almacenan en la tabla catalog_product_entity_datetime . Los valores para el atributo # 77 catalog_product.price están en la tabla catalog_product_entity_decimal .


¿Qué es interesante ver en la tabla eav_attribute en relación con los tipos de valor? Como señalé anteriormente, esta tabla describe los atributos para solo 4 de los 8 tipos de entidad registrados en eav_entity_type . Al mismo tiempo, para entidades como customer y customer_address todos los atributos que se definieron inicialmente son del tipo de valor static , es decir, son columnas ordinarias en la tabla y no aprovechan el enfoque EAV. Tablas:


  • customer_entity_datetime
  • customer_entity_decimal
  • customer_entity_int
  • customer_entity_text
  • customer_entity_varchar
  • customer_address_entity_datetime
  • customer_address_entity_decimal
  • customer_address_entity_int
  • customer_address_entity_text
  • customer_address_entity_varchar

inicialmente están vacíos y solo se pueden usar mediante programación (es decir, a través del panel de administración, sin extensiones de terceros, no hay forma de escribir nada en estas tablas).


EAV para categorías


Categorías de catálogo: esta es la primera entidad que utiliza más o menos el enfoque EAV en Magento. El tipo de entidad es catalog_category , el total de atributos iniciales es 30, de los cuales no son estáticos - 26. Es decir, solo 4 atributos ( children_count , level , path , position ) se almacenan en la tabla catalog_category_entity , el resto se almacena en catalog_category_entity_ [ datetime | decimal | int | text | varchar ].


La estructura de las tablas de este conjunto es muy similar entre sí y con tablas similares de otros tipos de entidades (clientes, sus direcciones, etc.):


 CREATE TABLE `catalog_category_entity_datetime` ( `value_id` int(11) NOT NULL AUTO_INCREMENT, `attribute_id` smallint(5) unsigned NOT NULL DEFAULT '0', `store_id` smallint(5) unsigned NOT NULL DEFAULT '0', `entity_id` int(10) unsigned NOT NULL DEFAULT '0', `value` datetime DEFAULT NULL, PRIMARY KEY (`value_id`), UNIQUE KEY `...` (`entity_id`,`attribute_id`,`store_id`), ... ) ... 

Para varios tipos de valores almacenados ( datetime , decimal , int , text , varchar ), solo cambia el tipo de columna de value . Esta estructura le permite guardar un valor separado ( value ) de un atributo separado ( attribute_id ) de una entidad separada ( entity_id ) para un escaparate separado ( store_id ).


En relación con las características arquitectónicas de Magento, se agrega una conexión adicional con el escaparate: store_id . Por lo tanto, es posible localizar los valores del mismo atributo de la misma entidad para diferentes escaparates. Las categorías de catálogo son las primeras entidades en Magento para las cuales puede usar el subsistema EAV directamente de fábrica. Puede establecer valores para los atributos del directorio a través del panel de administración.


imagen


No solo puede dar valores diferentes para los atributos de texto, traduciéndolos al idioma del escaparate correspondiente, sino también localizar atributos de otros tipos. Por ejemplo, en anticipación de las vacaciones de Navidad en ru storefront para el atributo catalog_category.custom_design_from puede establecer los valores el 7 de enero del próximo año, y en el escaparate el 24 de diciembre de este.


imagen


EAV para productos


En general, este es el mismo tipo de entidad para el que se lanzó EAV en Magento. El tipo de entidad es catalog_product , del total de atributos iniciales - 63, de los cuales no es estático - 56. La estructura de tablas que admiten EAV para productos es similar a la estructura de tablas para catálogos. Pero hay una diferencia significativa. Para los productos, puede crear nuevos atributos a través del panel de administración: esta es la funcionalidad predeterminada de Magento lista para usar. Si Magento proporciona solo estructuras de datos EAV para otras entidades en función de su llenado de software, entonces para los productos se implementa una interfaz que le permite hacer esto a nivel de usuario (gerente de tienda) - Tiendas / Atributos / Producto .


Para los productos, hay dos tablas más relacionadas con EAV:


  • eav_attribute_set
  • eav_attribute_group

En general, es más probable que muestren información que la almacenen. Los atributos del producto se combinan en un set y, al crear un producto, se le asigna un conjunto de atributos, lo que permite completar una tarjeta de producto para, por ejemplo, un televisor, elegir un conjunto de atributos relacionados específicamente con los electrodomésticos (o incluso para un grupo de productos llamados "televisores"). La fusión de atributos en conjuntos se produce en Tiendas / Atributos / Producto / Conjunto de atributos :


imagen


Total


En mi humilde opinión, Magento es un buen ejemplo del hecho de que la conveniencia de usar EAV es bastante limitada. Al marcar el uso de EAV para 8 entidades ( eav_entity_type ), la notación EAV se usa solo para 4 entidades ( eav_attribute ), de las cuales solo 2 entidades tienen atributos verdaderamente EAV: catalog_category y catalog_product . Además, para catalog_category atributos EAV no se usan para su propósito previsto (una gran cantidad de atributos diferentes para describir una entidad con una pequeña cantidad de atributos relacionados con una sola instancia ), sino para "mostrar la localización" de los valores de los atributos ( el mismo conjunto de atributos para una entidad "categoría de catálogo" con la capacidad de un atributo de instancia de tener diferentes significados para diferentes escaparates ).


El uso completo de EAV se usa solo para catalog_product (aunque también hay una mezcla de "localización de escaparate", pero esta es una extensión del modelo EAV, y no su profanación, como es el caso de las categorías). Pero con los productos, Magento revela EAV en su totalidad: la aplicación Magento se puede usar de forma segura para demostrar claramente los principios de EAV.

Source: https://habr.com/ru/post/441122/


All Articles