Я всегда задавался вопросом, в чем смысл таблиц:
eav_entity
eav_entity_datetime
eav_entity_decimal
eav_entity_int
eav_entity_store
eav_entity_text
Они всегда пусты. Они созданы в версиях до 1.6 app/code/core/Mage/Eav/sql/eav_setup/mysql4-install-0.7.0.php
и позже, они перенесли в скрипт установки для версий 1.6+. /app/code/core/Mage/Eav/sql/eav_setup/install-1.6.0.0.php
Я видел, что существует модель ресурсов, связанная с одной из таблиц Mage_Eav_Model_Resource_Entity_Store
(может быть, есть другие), но с ней ничего не происходит.
Есть ли какая-либо польза для этих таблиц или это другая «функция», которая была запущена и не реализована, как, например, версия макета или хлебные крошки администратора .
Ответы:
Я предполагаю, что это отчасти наследие и «удобный» шаблон для разработчиков для реализации «общих» сущностей / моделей.
Как вы сказали, связанные таблицы обычно пусты. Причина в том, что ни один из основных объектов EAV не использует эту структуру таблицы объектов по умолчанию. Это таблицы сущностей из установки 1.8:
Используя модель Customer в качестве примера, мы видим, что модель ресурсов
Mage_Customer_Model_Resource_Customer
расширяетсяMage_Eav_Model_Entity_Abstract
, Source .Примечание . До версии 1.6 модель ресурса для сущности клиента
Mage_Customer_Model_Entity_Customer
также была расширенаMage_Eav_Model_Entity_Abstract
, Source .Если мы рассмотрим
Mage_Eav_Model_Entity_Abstract
класс, мы найдемgetEntityTable
метод. Этот метод используется, чтобы определить, какую таблицу использовать при построении запросов во время обычных операций CRUD. Другой метод, который представляет интересgetValueTablePrefix
. Он определяет префикс для таблиц для данных таблиц «типа»,*_datetime
,*_decimal
,*_varchar
и так далее.Заглянуть в источник этих методов ( здесь и здесь ).
В приведенном выше методе мы можем видеть, что если тип сущности не определяет пользовательскую таблицу, то по умолчанию используется
Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE
. Значение этой константы равно значению'eav/entity'
, которое в свою очередь превращается вeav_entity
таблицу (при условии, что в приложении нет настроенного префикса таблицы). Второй метод, который я упомянул, использует эту таблицу в качестве префикса, если ни один из них не был настроен для данного объекта. Если вы изучите значения вeav_entity_type
таблице дляvalue_table_prefix
столбца, вы заметите, что они всеNULL
.Логика метода довольно проста: если префикс значения не определен, используйте имя таблицы сущностей в качестве префикса.
Я предполагаю, что, поскольку эти таблицы были в Magento так долго, лучше оставить их для какой-либо обратной совместимости, чем полностью удалить их. Идея, которую, я полагаю, они преследовали, заключалась в простой в использовании структуре сущности / модели, которую другие разработчики могли бы просто расширить на несколько классов и иметь эти «динамические» атрибуты, которые можно изменить через администратора (см. Каталог продуктов и моделей клиентов). К сожалению, реализация и практика указанного паттерна, кажется, плохо масштабируются и приводят к проблемам. Я никогда не видел, чтобы эта структура использовалась в дикой природе, вероятно, из-за отсутствия документации и примеров использования или низкой производительности.
Я не ведущий разработчик (или археолог), но это то, что я извлекаю из кода и структур данных, надеюсь, это поможет пролить некоторый свет.
источник
Рассмотрим этот фрагмент кода в базовой модели ресурсов EAV.
Этот метод извлекает имя таблицы базовых сущностей для хранения. Таким образом, для модели ресурсов продукта этот метод вернется
catalog_product_entity
(при условии, что префикс имени таблицы не был установлен)Эти четыре строки являются наиболее показательными.
Если у сущности нет таблицы, используется следующая константа
Эта
eav/entity
строка затем используется для поиска имени таблицыКоторый извлекает имя таблицы из конфига.
Ах, ха! Если тип сущности eav не имеет установленного имени таблицы, то Magento будет использовать
eav_entity
таблицы в качестве места хранения по умолчанию.Изначально команда инженеров Magento была очарована концепцией EAV - в то время как современный Magento сократил этот показатель, модели EAV стали предпочтительным решением для многих проблем.
Представляется разумным предположить / предположить, что первоначальная предварительная реализация EAV хранила все данные в этой центральной
eav_entity
таблице типов (общий шаблон на корпоративных платформах), а типы сущностей появились позже.Еще одна (неотразимая) возможность - эта функция была предназначена для включения «бесстольных» моделей CRUD. Теоретически, можно было бы вставить правильную информацию о типе EAV, настроить классы модели / ресурса / коллекции и сохранить данные в этих
eav_entity
таблицах. Отказ Magento от EAV, а также внимание инженера-проектировщика к функциям конечных пользователей после запуска означало, что эта функция исчезла в тумане. Хотя мне было бы любопытно, сработает ли это, я бы не хотел на это полагаться, поскольку этому пути кода не уделялось много внимания, и сомнительно, что TAF охватывает его использование.источник
Magento использует модель данных под названием «Значение атрибута сущности» для многих своих функций (клиенты, продукты и т. Д.). Это то, что позволяет динамические атрибуты в системе без необходимости реструктурировать и изменять таблицы на лету. EAV В Википедии
источник