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_Customer
estende Mage_Eav_Model_Entity_Abstract
, Fonte .
Nota : prima dell'1.6 era stato Mage_Customer_Model_Entity_Customer
esteso anche il modello di risorsa per l'entità cliente Mage_Eav_Model_Entity_Abstract
, Fonte .
Se esaminiamo la Mage_Eav_Model_Entity_Abstract
classe troviamo un getEntityTable
metodo. 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
, *_varchar
e 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_entity
tabella (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_type
tabella per la value_table_prefix
colonna, 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.