Magento 2 EAV: Visão Geral das Estruturas de Dados

Nesta publicação, revisarei as estruturas de dados do Magento 2 que suportam um conceito como o EAV . Às vezes, os desenvolvedores precisam sair da natureza do código e tentar pesquisar seus locais de vida a partir da altura do voo de uma águia - isso permite que você se concentre em coisas realmente importantes ou apenas grandes. Então eu saí.


imagem


O acrônimo EAV é divulgado como Entidade - Atributo - Valor (é para aqueles que não seguiram o link acima). A principal “ vantagem ” do EAV é o uso eficiente do espaço do banco de dados nos casos em que o número possível de vários atributos (propriedades, parâmetros) que podem ser usados ​​para descrever coisas (entidades) é muito amplo, mas o número de atributos, que na verdade se refere a objeto individual é relativamente pequeno. Um bom exemplo desse caso no comércio eletrônico é o conceito de "produto" - os atributos significativos dos produtos " TV " (tamanho da tela) diferem dos atributos significativos dos produtos " saco de dormir " (temperatura mínima confortável).


Então, o que o Magento 2 oferece para armazenar dados no formato EAV?


espaço para nome 'eav_'


No banco de dados Magento 2.3 eav_ , existem 21 tabelas com o prefixo eav_ . Todos eles podem ser divididos em três grupos:


  • eav_attribute
  • eav_entity
  • eav_form

A maneira mais fácil é com o eav_form - essas tabelas se relacionam à exibição de alguns dados EAV na interface do usuário e não se relacionam diretamente ao posicionamento de dados EAV no banco de dados (considero apenas estruturas de dados e apenas do ponto de vista do armazenamento de informações, não sua exibição). Para o experimento, excluí as eav_form espaço eav_form do banco de dados e isso não me impediu de fazer um pedido na loja. Portanto, você ainda precisa procurar onde os dados deste espaço de tabela são usados ​​e quanto é necessário para o Magento funcionar.


Dos dois restantes, o grupo eav_attribute refere-se à letra A (ttribute) e o grupo eav_entity à letra E (ntity) . Onde está a letra V (alue) ?


Os valores para os atributos da entidade devem ser pesquisados ​​nos sufixos do nome da tabela:


  • _datetime
  • _decimal
  • _int
  • _text
  • _ varchar

Você pode ver as tabelas que começam com:


  • catalog_category_entity_
  • catalog_product_entity_
  • customer_address_entity_
  • customer_entity_
  • eav_entity_

Uma multiplicação simples do número de sufixos (5) pelo número de prefixos (5) fornece o número total de tabelas (25) nas quais os dados dos valores devem ser armazenados.


'eav_entity_type': registro do tipo de entidade


O início do EAV no Magento precisa ser encontrado na tabela eav_entity_type . É aqui que define quais tipos de valores de atributo de entidades serão armazenados na estrutura do EAV. Portanto, inicialmente o Magento 2.3 oferece essa opção para as oito entidades a seguir:


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

'eav_attribute': registro de atributo


O próximo passo é descobrir quais atributos esses tipos de entidades podem caracterizar. Esta informação está na tabela eav_attribute . O registro de atributo tem um fechamento no registro de tipos de entidade por chave estrangeira . No registro de atributo, inicialmente 135 entradas pertencentes a 4 tipos de entidades:


  • customer
  • customer_address
  • catalog_category
  • catalog_product


    Do que isso está falando? Bem, pelo menos esses outros tipos de entidades:


  • order
  • invoice
  • creditmemo
  • shipment

Não use a estrutura EAV para armazenar dados. Ou seja, em algum momento, o entusiasmo estava presente e o uso do EAV foi planejado para oito tipos de entidades, mas na verdade eles pararam às 4.


'eav_entity_': espaço fantasma


O eav_entity tabela eav_entity assemelha a cidades fantasmas chinesas - das 9 tabelas de espaço, apenas duas contêm dados:


  • eav_entity_type : este é um registro dos tipos de entidade que mencionei acima;
  • eav_entity_attribute : usado para organizar atributos em grupos (mais perto da exibição de dados do que de seu armazenamento); essas informações se relacionam mais diretamente aos atributos em si do que às entidades (ou seja, obviamente que não são desta paróquia - elas têm um lugar no espaço eav_attribute_ );

As 7 tabelas restantes estão vazias:


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

É muito semelhante a tentar unificar a maneira de armazenar valores para atributos de entidade em um conjunto de tabelas ( datetime , decimal , int , text , varchar ) em vez de ter 5 tabelas com os sufixos correspondentes para cada tipo de entidade. Numa tentativa malsucedida? Ou é o futuro do EAV no Magento?


imagem


Enfim A terra estava sem forma e vazia, e as trevas estavam acima do abismo, e o Espírito de Deus essas tabelas não são usadas inicialmente.


Tipos de valor de atributo


eav_entity_type tipos de eav_entity_type são configurados na tabela eav_attribute os próprios atributos e sua ligação aos tipos de entidade correspondentes são configurados na tabela eav_attribute . E como determinar onde procurar o valor para esse atributo de uma entidade?


O campo eav_attribute.backend_type nos ajudará com isso. Mostra onde os valores dos atributos estão armazenados:


  • estático : na tabela com dados sobre a própria entidade (por exemplo, os valores do atributo # 9 - customer.email , é necessário pesquisar na tabela customer_entity na coluna email );

Para os tipos restantes, os valores são armazenados em tabelas separadas, nos nomes dos quais o prefixo corresponde ao tipo de entidade ( customer_ , ...) e o sufixo a um dos tipos de dados:


  • datetime
  • decimal
  • int
  • text
  • varchar

Ou seja, os valores para o atributo # 79 catalog_product.special_from_date tipo datetime são armazenados na tabela catalog_product_entity_datetime . Os valores para o atributo # 77 catalog_product.price estão na tabela catalog_product_entity_decimal .


O que é interessante ver na tabela eav_attribute em relação aos tipos de valor? Como observei acima, esta tabela descreve os atributos para apenas 4 dos 8 tipos de entidade registrados em eav_entity_type . Ao mesmo tempo, para entidades como customer e customer_address todos os atributos que foram definidos inicialmente são do tipo de valor static - ou seja, são colunas comuns na tabela e não tiram vantagem da abordagem EAV. Tabelas:


  • 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

estão inicialmente vazios e podem ser usados ​​apenas programaticamente (ou seja, através do painel de administração, sem extensões de terceiros, não há como gravar nada nessas tabelas).


EAV para categorias


Categorias de catálogo - esta é a primeira entidade que mais ou menos usa a abordagem EAV no Magento. O tipo de entidade é catalog_category , o total de atributos iniciais é 30, dos quais não estáticos - 26. Ou seja, os valores de apenas 4 atributos ( children_count , level , path , position ) são armazenados na tabela catalog_category_entity , o restante é armazenado no catalog_category_entity_ [ datetime | decimal | int | text varchar ].


A estrutura das tabelas deste conjunto é muito semelhante uma à outra e a tabelas semelhantes de outros tipos de entidades (clientes, seus endereços 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 vários tipos de valores armazenados ( datetime , decimal , int , text , varchar ), apenas o tipo da coluna de value alterado. Essa estrutura permite salvar um valor separado ( value ) de um atributo separado ( attribute_id ) de uma entidade separada ( entity_id ) para uma loja separada ( store_id ).


Em conexão com os recursos arquiteturais do Magento, uma conexão adicional com a store_id da loja é store_id - store_id . Assim, é possível localizar os valores do mesmo atributo da mesma entidade para diferentes fachadas de lojas. As categorias de catálogo são as primeiras entidades no Magento para as quais você pode usar o subsistema EAV diretamente da caixa. Você pode definir valores para atributos de diretório através do painel de administração.


imagem


Você não pode apenas fornecer valores diferentes para atributos de texto, traduzindo para o idioma da montra correspondente, mas também localizar atributos de outros tipos. Por exemplo, em antecipação às férias de Natal na loja virtual para o atributo catalog_category.custom_design_from você pode definir os valores em 7 de janeiro do próximo ano e na loja em 24 de dezembro.


imagem


EAV para produtos


Em geral, esse é o mesmo tipo de entidade para a qual o EAV foi lançado no Magento. O tipo de entidade é catalog_product , do total de atributos iniciais - 63, dos quais não estáticos - 56. A estrutura das tabelas que suportam o EAV para produtos é semelhante à estrutura das tabelas para catálogos. Mas há uma diferença significativa. Para produtos, você pode criar novos atributos através do painel de administração - essa é a funcionalidade padrão do Magento pronta para uso. Se o Magento fornecer apenas estruturas de dados EAV para outras entidades com base no preenchimento de software, será implementada uma interface para produtos no nível do usuário (gerente de loja) - Lojas / Atributos / Produto .


Para os produtos, há mais duas tabelas relacionadas ao EAV:


  • eav_attribute_set
  • eav_attribute_group

Em geral, é mais provável que eles exibam informações do que as armazenem. Os atributos do produto são combinados em um set e, ao criar um produto, um conjunto de atributos é atribuído a ele, o que permite o preenchimento de um cartão de produto para, por exemplo, uma TV, escolhendo um conjunto de atributos relacionados especificamente a eletrodomésticos (ou mesmo para um grupo de produtos chamado "TVs"). A mesclagem de atributos em conjuntos ocorre em Lojas / Atributos / Produto / Conjunto de Atributos :


imagem


Total


IMHO, Magento é um bom exemplo do fato de que a adequação do uso do EAV é bastante estreita. Ao marcar o uso de EAV para 8 entidades ( eav_entity_type ), a notação EAV é usada apenas para 4 entidades ( eav_attribute ), das quais apenas duas entidades possuem atributos realmente EAV - catalog_category e catalog_product . Além disso, para catalog_category atributos EAV são usados ​​não para a finalidade pretendida (um grande número de atributos diferentes para descrever uma entidade com um pequeno número de atributos relacionados a uma única instância ), mas para "mostrar a localização" dos valores dos atributos ( o mesmo conjunto de atributos para uma entidade "categoria de catálogo" com a capacidade de um atributo de instância ter significados diferentes para diferentes fachadas de lojas ).


O uso completo do EAV é usado apenas para catalog_product (embora haja também uma mistura de "localização de loja", mas essa é uma extensão do modelo EAV, e não sua profanação, como é o caso das categorias). Mas com os produtos Magento revela o EAV na íntegra - a aplicação Magento pode ser usada com segurança para demonstrar claramente os princípios do EAV.

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


All Articles