La mia ipotesi è che sia parte dell'eredità e un modello di "convenienza" per gli sviluppatori di implementare entità / modelli "generici".
Come hai affermato, le tabelle correlate sono generalmente vuote. Il motivo è che nessuna delle entità EAV principali utilizza questa struttura di tabella entità "predefinita". Queste sono le tabelle delle entità da un'installazione 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 il modello Cliente come esempio, possiamo vedere che il modello risorsa si Mage_Customer_Model_Resource_Customerestende Mage_Eav_Model_Entity_Abstract, Fonte .
Nota : prima dell'1.6 era stato Mage_Customer_Model_Entity_Customeresteso anche il modello di risorsa per l'entità cliente Mage_Eav_Model_Entity_Abstract, Fonte .
Se esaminiamo la Mage_Eav_Model_Entity_Abstractclasse troviamo un getEntityTablemetodo. Questo metodo viene utilizzato per determinare quale tabella utilizzare durante la creazione di query durante le operazioni CRUD comuni. Un altro metodo che è di interesse è getValueTablePrefix. Esso determina il prefisso per le tabelle di dati per tabelle "tipo", *_datetime, *_decimal, *_varchare così via.
Sbirciando nella fonte per quei metodi ( qui e qui ).
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;
}
Nel metodo sopra si può vedere che se il tipo di entità non definisce una tabella personalizzata come da impostazione predefinita Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE. Il valore di quella costante è 'eav/entity', che a sua volta viene trasformato nella eav_entitytabella (supponendo che non vi sia un prefisso di tabella configurato nell'applicazione). Il secondo metodo che ho citato ricade su questa tabella come prefisso se nessuno è stato configurato per la data entità. Se si esaminano i valori nella eav_entity_typetabella per la value_table_prefixcolonna, si noterà che sono tutti 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;
}
La logica nel metodo è piuttosto semplice, se non viene definito alcun prefisso valore utilizzare il nome della tabella entità come prefisso.
Presumo che dato che questi tavoli sono stati in Magento per così tanto tempo, è meglio lasciarli per qualsiasi retrocompatibilità piuttosto che rimuoverli del tutto. L'idea che credo stessero cercando era una struttura entità / modello facile da usare che altri sviluppatori potessero semplicemente estendere alcune classi e avere questi attributi "dinamici" che potevano essere cambiati tramite l'amministratore (vedere i prodotti del catalogo e i modelli dei clienti). Sfortunatamente l'implementazione e la pratica di tale modello non sembrano ridimensionarsi bene e portano a problemi. Non ho mai visto questa struttura utilizzata in natura, probabilmente a causa della mancanza di documentazione e di casi d'uso esemplificativi o di prestazioni scadenti.
Non sono uno sviluppatore principale (o archeologo) ma è quello che raccolgo dal codice e dalle strutture di dati, si spera che aiuti a far luce.