Я здогадуюсь, що це частина спадщини та "зручність" для розробників для впровадження "загальних" об'єктів / моделей.
Як ви вже заявляли, пов'язані таблиці зазвичай порожні. Причина полягає в тому, що жоден з основних об'єктів EAV не використовує цю структуру таблиці "за замовчуванням". Це таблиці сутностей із встановленням 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)
Використовуючи модель клієнта як приклад, ми можемо побачити, що модель ресурсу Mage_Customer_Model_Resource_Customer
поширюється Mage_Eav_Model_Entity_Abstract
, Джерело .
Примітка : До 1.6 ресурсна модель для юридичної особи-замовника була Mage_Customer_Model_Entity_Customer
також розширена Mage_Eav_Model_Entity_Abstract
, Джерело .
Якщо ми вивчаємо Mage_Eav_Model_Entity_Abstract
клас, то знаходимо getEntityTable
метод. Цей метод використовується для визначення того, яку таблицю використовувати для побудови запитів під час загальних операцій CRUD. Інший цікавий метод - це getValueTablePrefix
. Він визначає префікс для таблиць для даних таблиць «типу», *_datetime
, *_decimal
, *_varchar
і так далі.
Зазирнути до джерела цих методів ( тут і тут ).
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;
}
У вищевказаному методі ми бачимо, що якщо тип сутності не визначає власну таблицю, для якої вона за замовчуванням Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE
. Значення цієї константи - це 'eav/entity'
, що, в свою чергу, перетворюється на eav_entity
таблицю (припускаючи, що в додатку немає налаштованого префікса таблиці). Другий метод, про який я згадував, потрапляє в цю таблицю як префікс, якщо жоден не був налаштований для даної сутності. Якщо ви вивчите значення в eav_entity_type
таблиці для value_table_prefix
стовпця, ви помітите, що вони всі 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;
}
Логіка методу досить проста, якщо не визначений префікс значення, використовуйте ім'я таблиці сутності як префікс.
Я припускаю, що оскільки ці таблиці вже так довго існують у Magento, то краще залишити їх для будь-якої сумісності назад, ніж видаляти їх прямо. Ідея, на яку я вважаю, що вони збиралися, була простою у використанні структурою сутності / моделі, що інші розробники можуть просто розширити кілька класів і мати ці "динамічні" атрибути, які можна змінити через адміністратора (див. Каталог продуктів та моделі клієнтів). На жаль, впровадження та практика зазначеного шаблону не виглядає добре масштабним і призводить до проблем. Я ніколи не бачив, щоб ця структура використовувалася в дикій природі, ймовірно, через відсутність документації та випадків використання прикладів або низької продуктивності.
Я не основний розробник (або археолог), але це те, що я збираю з коду та структур даних, сподіваюся, це допомагає пролити трохи світла.