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.php
e, 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.
Respostas:
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:
Usando o modelo do cliente como exemplo, podemos ver que o modelo de recursos
Mage_Customer_Model_Resource_Customer
se estendeMage_Eav_Model_Entity_Abstract
, Origem .Nota : Antes da 1.6, o modelo de recursos para a entidade do cliente
Mage_Customer_Model_Entity_Customer
também era estendidoMage_Eav_Model_Entity_Abstract
, Origem .Se examinarmos a
Mage_Eav_Model_Entity_Abstract
classe, encontramos umgetEntityTable
mé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
,*_varchar
e assim por diante.Espreitando a fonte para esses métodos ( aqui e aqui ).
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 emeav_entity
tabela (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 naeav_entity_type
tabela para avalue_table_prefix
coluna, perceberá que são todosNULL
.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.
fonte
Considere esse bit de código no modelo de recurso EAV básico.
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.
Se a entidade não tiver uma tabela definida, a constante a seguir será usada
Essa
eav/entity
sequência é usada para procurar o nome de uma tabelaQue arranca o nome da tabela da configuração.
Ah ha! Se um tipo de entidade eav não tiver um nome de tabela definido, o Magento usará as
eav_entity
tabelas 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_entity
tabela 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_entity
tabelas. 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.fonte
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
fonte