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_Customer
se 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_Customer
também era estendido Mage_Eav_Model_Entity_Abstract
, Origem .
Se examinarmos a Mage_Eav_Model_Entity_Abstract
classe, encontramos um getEntityTable
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 ).
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_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 na eav_entity_type
tabela para a value_table_prefix
coluna, 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.