O objetivo das tabelas 'eav_'

19

Eu sempre me perguntei qual é o significado das tabelas:

eav_entity  
eav_entity_datetime
eav_entity_decimal
eav_entity_int
eav_entity_store
eav_entity_text

Eles estão sempre vazios. Eles são criados nas versões anteriores à 1.6 app/code/core/Mage/Eav/sql/eav_setup/mysql4-install-0.7.0.phpe, posteriormente, transportados para o script de instalação das versões 1.6+ /app/code/core/Mage/Eav/sql/eav_setup/install-1.6.0.0.php
. Vi que há um modelo de recursos vinculado a uma das tabelas Mage_Eav_Model_Resource_Entity_Store(talvez existam outras), mas nada acontece com ele.

Existe alguma utilidade nessas tabelas ou esse é um outro "recurso" iniciado e não implementado como a versão do layout ou as trilhas de navegação do administrador, por exemplo.

Marius
fonte
3
Quando comecei a aprender Magento e especialmente EAV, vejo que essas tabelas estão sempre vazias. Tentei pesquisar online, mas também não recebi nenhuma resposta especificada. Eu pensei que poderia ser uma definição ou tabela de referência para outras tabelas de entidade. Mas agora também estou esperando ansiosamente pela resposta. Obrigado por esta pergunta. :)
MagentoBoy 22/01
@MagentoBoy. Também vi quando comecei a trabalhar com o Magento, enquanto tentava entender o banco de dados. Faz mais de 5 anos e ainda estou confuso.
Marius
..mas vocês estão realmente tendo boas habilidades no magento .. Às vezes, eu uso suas referências para aprender e no meu código também .. Já faz cerca de 7 a 8 meses no magento e 11 meses na experiência em php Mas ainda sinto que eu sou um novato para Magento e necessidade de aprender muito ..
MagentoBoy

Respostas:

17

Meu palpite é que é parte do legado e um padrão de "conveniência" para os desenvolvedores implementarem entidades / modelos "genéricos".

Como você afirmou, as tabelas relacionadas geralmente estão vazias. O motivo é que nenhuma das entidades principais do EAV usa essa estrutura de tabela de entidade "padrão". Estas são as tabelas de entidade de uma instalação 1.8:

mysql> select distinct(entity_table) from eav_entity_type;
+-------------------------+
| entity_table            |
+-------------------------+
| customer/entity         |
| customer/address_entity |
| sales/order             |
| sales/order_entity      |
| catalog/category        |
| catalog/product         |
| sales/quote             |
| sales/quote_address     |
| sales/quote_entity      |
| sales/quote_item        |
| sales/invoice           |
+-------------------------+
11 rows in set (0.00 sec)

Usando o modelo do cliente como exemplo, podemos ver que o modelo de recursos Mage_Customer_Model_Resource_Customerse estende Mage_Eav_Model_Entity_Abstract, Origem .

Nota : Antes da 1.6, o modelo de recursos para a entidade do cliente Mage_Customer_Model_Entity_Customertambém era estendido Mage_Eav_Model_Entity_Abstract, Origem .

Se examinarmos a Mage_Eav_Model_Entity_Abstractclasse, encontramos um getEntityTablemétodo. Este método é usado para determinar qual tabela usar ao criar consultas durante operações CRUD comuns. Outro método que é de interesse é getValueTablePrefix. Ele determina o prefixo para as tabelas para tabelas de dados "tipo", *_datetime, *_decimal, *_varchare assim por diante.

Espreitando a fonte para esses métodos ( aqui e aqui ).

public function getEntityTable()
    {
        if (!$this->_entityTable) {
            $table = $this->getEntityType()->getEntityTable();
            if (!$table) {
                $table = Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE;
            }
            $this->_entityTable = Mage::getSingleton('core/resource')->getTableName($table);
        }

        return $this->_entityTable;
    }

No método acima, podemos ver que, se o tipo de entidade não definir uma tabela personalizada, será padronizado Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE. O valor dessa constante é 'eav/entity', que por sua vez é transformado em eav_entitytabela (assumindo que não há prefixo de tabela configurado no aplicativo). O segundo método que mencionei recai nesta tabela como um prefixo se nenhum tiver sido configurado para a entidade especificada. Se você examinar os valores na eav_entity_typetabela para a value_table_prefixcoluna, perceberá que são todos NULL.

public function getValueTablePrefix()
    {
        if (!$this->_valueTablePrefix) {
            $prefix = (string)$this->getEntityType()->getValueTablePrefix();
            if (!empty($prefix)) {
                $this->_valueTablePrefix = $prefix;
                /**
                * entity type prefix include DB table name prefix
                */
                //Mage::getSingleton('core/resource')->getTableName($prefix);
            } else {
                $this->_valueTablePrefix = $this->getEntityTable();
            }
        }

        return $this->_valueTablePrefix;
    }

A lógica no método é bastante simples, se nenhum prefixo de valor for definido, use o nome da tabela de entidades como prefixo.

Presumo que, uma vez que essas tabelas estejam no Magento há tanto tempo, é melhor deixá-las para qualquer compatibilidade com versões anteriores do que removê-las completamente. A ideia que eu acreditava que eles buscavam era uma estrutura de entidade / modelo fácil de usar, que outros desenvolvedores poderiam apenas estender algumas classes e ter esses atributos "dinâmicos" que poderiam ser alterados pelo administrador (consulte produtos de catálogo e modelos de clientes). Infelizmente, a implementação e a prática do referido padrão não parecem ter uma boa escala e levam a problemas. Eu nunca vi essa estrutura usada na natureza, provavelmente devido à falta de documentação e exemplos de casos de uso ou desempenho ruim.

Não sou desenvolvedor central (ou arqueólogo), mas é o que eu recolho das estruturas de código e dados; espero que ajude a esclarecer algumas coisas.

beeplogic
fonte
1
Obrigada pelo esclarecimento. Bom o suficiente para mim. Vou tentar criar uma entidade que use essas tabelas apenas por diversão.
Marius
6

Considere esse bit de código no modelo de recurso EAV básico.

#File: app/code/core/Mage/Eav/Model/Entity/Abstract.php
public function getEntityTable()
{
    if (!$this->_entityTable) {
        $table = $this->getEntityType()->getEntityTable();
        if (!$table) {
            $table = Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE;
        }
        $this->_entityTable = Mage::getSingleton('core/resource')->getTableName($table);
    }

    return $this->_entityTable;
}

Este método captura o nome da tabela de entidade base a ser usado para armazenamento. Portanto, para o modelo de recursos de um produto, esse método retornará catalog_product_entity(assumindo que nenhum prefixo de nome de tabela tenha sido definido)

Essas quatro linhas são as mais reveladoras.

#File: app/code/core/Mage/Eav/Model/Entity/Abstract.php
$table = $this->getEntityType()->getEntityTable();
if (!$table) {
    $table = Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE;
}

Se a entidade não tiver uma tabela definida, a constante a seguir será usada

#File: app/code/core/Mage/Eav/Model/Entity.php
const DEFAULT_ENTITY_TABLE      = 'eav/entity';

Essa eav/entitysequência é usada para procurar o nome de uma tabela

#File: app/code/core/Mage/Eav/Model/Entity/Abstract.php
Mage::getSingleton('core/resource')->getTableName($table);

Que arranca o nome da tabela da configuração.

<!-- File: app/code/core/Mage/Eav/etc/config.xml -->
<entity>
    <table>eav_entity</table>
</entity>

Ah ha! Se um tipo de entidade eav não tiver um nome de tabela definido, o Magento usará as eav_entitytabelas como local de armazenamento padrão.

A equipe original de engenharia do Magento estava apaixonada pelo conceito de EAV - enquanto o Magento moderno reduziu isso, os modelos de EAV eram a solução preferida para muitos problemas.

Parece razoável supor / especular que a implementação inicial do EAV de pré-lançamento armazenou todos os dados nessa eav_entitytabela de tipos central (um padrão comum nas plataformas corporativas), e os tipos de entidade surgiram mais tarde.

Outra possibilidade (convincente) é que esse recurso foi projetado para permitir modelos CRUD "sem mesa". Em teoria, seria possível inserir as informações corretas do tipo EAV, configurar suas classes de modelo / recurso / coleção e ter dados armazenados nessas eav_entitytabelas. O afastamento do Magento do EAV e o foco pós-lançamento na equipe de engenharia nos recursos do usuário final fizeram com que esse recurso desaparecesse na névoa. Embora eu esteja curioso para saber se isso funciona, eu não gostaria de confiar nele, pois não é um caminho de código que recebe muita atenção e é duvidoso que o TAF cubra seu uso.

Alan Storm
fonte
1
Obrigado pela explicação detalhada. Definitivamente vou tentar criar um módulo com uma entidade "tableless" para ver se funciona. +1 de mim. Mas me sinto obrigado a aceitar a resposta fornecida pela @beeplogic que afirma basicamente as mesmas coisas. Ele foi 5 minutos mais rápido.
Marius
-1

O Magento usa um modelo de dados chamado "Valor do atributo da entidade" para muitas de suas funções (clientes, produtos, etc.). É isso que permite atributos dinâmicos no sistema sem precisar reestruturar e alterar as tabelas em tempo real. EAV na Wikipedia

Adam R.
fonte
Obrigado, mas isso realmente não responde à pergunta. Qual entidade usa as tabelas mencionadas na pergunta? Eu não estava falando sobre cliente, produtos ou categorias.
Marius