Je suppose que c'est en partie hérité et un modèle de «commodité» pour les développeurs d'implémenter des entités / modèles «génériques».
Comme vous l'avez dit, les tableaux associés sont généralement vides. La raison en est qu'aucune des principales entités EAV n'utilise cette structure de table d'entités "par défaut". Ce sont les tables d'entités d'une installation 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)
En utilisant le modèle Client comme exemple, nous pouvons voir que le modèle de ressource Mage_Customer_Model_Resource_Customer
s'étend Mage_Eav_Model_Entity_Abstract
, Source .
Remarque : Avant la version 1.6, le modèle de ressource de l'entité cliente était Mage_Customer_Model_Entity_Customer
également étendu Mage_Eav_Model_Entity_Abstract
, Source .
Si nous examinons la Mage_Eav_Model_Entity_Abstract
classe, nous trouvons une getEntityTable
méthode. Cette méthode est utilisée pour déterminer la table à utiliser lors de la génération de requêtes lors des opérations CRUD courantes. Une autre méthode intéressante est getValueTablePrefix
. Il détermine le préfixe pour les tables de données tables « de type », *_datetime
, *_decimal
, *_varchar
et ainsi de suite.
Jetez un œil à la source de ces méthodes ( ici et ici ).
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;
}
Dans la méthode ci-dessus, nous pouvons voir que si le type d'entité ne définit pas de table personnalisée, il est par défaut Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE
. La valeur de cette constante est 'eav/entity'
, qui à son tour est transformée en eav_entity
table (en supposant qu'il n'y a pas de préfixe de table configuré dans l'application). La deuxième méthode que j'ai mentionnée retombe sur cette table en tant que préfixe si aucune n'a été configurée pour l'entité donnée. Si vous examinez les valeurs du eav_entity_type
tableau de la value_table_prefix
colonne, vous remarquerez qu'elles sont toutes 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 logique de la méthode est plutôt simple, si aucun préfixe de valeur n'est défini, utilisez le nom de la table d'entités comme préfixe.
Je suppose que depuis que ces tables sont dans Magento depuis si longtemps, il est préférable de les laisser pour une compatibilité descendante plutôt que de les supprimer purement et simplement. L'idée que je pensais qu'ils cherchaient était une structure d'entité / modèle facile à utiliser que d'autres développeurs pourraient simplement étendre quelques classes et avoir ces attributs "dynamiques" qui pouvaient être modifiés via l'administrateur (voir les produits du catalogue et les modèles client). Malheureusement, la mise en œuvre et la pratique de ce modèle ne semblent pas bien évoluer et entraînent des problèmes. Je n'ai jamais vu cette structure utilisée dans la nature, probablement en raison du manque de documentation et d'exemples d'utilisation ou de mauvaises performances.
Je ne suis pas développeur principal (ou archéologue) mais c'est ce que je comprends du code et des structures de données, j'espère que cela aidera à faire la lumière.