Ответ 1
Отличный вопрос, но, конечно, нет "одного истинного пути". Согласно @BenV, Magento использует модель EAV. Мой опыт работы с ним был в целом положительным, однако он запускает других пользователей. Некоторые соображения:
1. Производительность. EAV требует сложного объединения нескольких таблиц для заполнения вашего объекта соответствующими атрибутами. Это наносит удар производительности. Однако это можно смягчить путем тщательного кэширования (на всех уровнях через стек, включая кэширование запросов) и выборочного использования денормализации. Magento позволяет администраторам выбирать денормализованную модель для категорий и продуктов, где это гарантирует количество SKU (обычно в тысячах). Это, в свою очередь, требует, чтобы наблюдатели запускали повторную индексацию (всегда хорошо!) И обновляли "плоские" денормализованные таблицы при изменении данных о товаре. Это также можно планировать или вручную запускать с приглашением администратора.
2. Сложность сторонних лиц Если вы когда-либо планируете сделать это приложение доступным для других пользователей, многие из них найдут EAV слишком сложным, и в конечном итоге вы столкнетесь с большим блеском и неосведомленным злоупотреблением на форумах пользователей (ref Magento!).
3. Будущая расширяемость и архитектура плагинов. Нет сомнений в том, что модель EAV действительно входит в нее, когда расширяемость является фактором. Очень просто добавлять новые атрибуты в модель, сводя к минимуму риск нарушения существующего кода ORM и контроллера.
4. Изменения типа данных
EAV делает немного сложнее изменить типы данных атрибутов. Если ваш первоначальный проект вызывает конкретный тип данных атрибута, который изменяется в будущем (например, int
- varchar
), это означает, что вам придется перенести все записи для этого атрибута в соответствующую таблицу, соответствующую новому типу данных. Конечно, пуристы предположили бы, что вы получите дизайн в первый раз, но реальность иногда вторгается!
5. Ручной импорт продукта Одна вещь, которую EAV делает практически невозможной, - это импорт продуктов (или других объектов) в базу данных с использованием CSV/XML в формате SQL и/или phpMyAdmin. Вам нужно будет написать модуль импортера, который принимает структурированные данные и передает его через слой модели приложения, чтобы сохранить его в базе данных. Это добавляет вашей сложности.