Подтвердить что ты не робот

Должен ли я использовать модель EAV?

Я разрабатываю свою базу данных/домен для приложения электронной коммерции, и мне сложно определить, как хранить продукты.

На сайте будет продаваться широкий ассортимент товаров, ручек, стрингов, татуировок, зонтиков, всего. Каждый из этих продуктов будет иметь несколько общих атрибутов, высоты, ширины, длины, веса и т.д., Но некоторые продукты имеют специальные данные. Например, ручки имеют разные цвета чернил, а кончики/крышки и брошюры могут иметь разные типы складок. До сих пор я придумал еще 20 дополнительных атрибутов, но эти атрибуты могут применяться только к 1% продуктов на веб-сайте.

Так что мне интересно, правильно ли использовать EAV-модель для обработки дополнительных данных. Помня о том, что, когда клиенты просматривают сайт в интерфейсе, появится боковая панель фильтрации, например, на eBay и carsales.com.au. (Таким образом, имея в виду, будет справедливый запрос)

Я не считаю целесообразным реализовать наследование класса Table, поскольку система должна оставаться гибкой. Это связано с тем, что в будущем по треку мы можем иметь больше атрибутов в будущем с новыми типами продуктов.

Другое, что я рассмотрел, это использование базы данных NoSQL (возможно, MongoDB), но у меня мало опыта работы с этими типами баз данных, она даже решит мою проблему?

Обзор параметров:

  • Единый продукт с большим количеством столбцов
  • Отдельный атрибут entity (EAV)
  • Переключение на сохранение без схемы

Я собираюсь создать прототип с сущностью атрибутов, чтобы увидеть, насколько он гибкий, и проверить производительность и как неконтролируемый запрос.

EDIT: Я, конечно, открываю любые другие решения.

4b9b3361

Ответ 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. Вам нужно будет написать модуль импортера, который принимает структурированные данные и передает его через слой модели приложения, чтобы сохранить его в базе данных. Это добавляет вашей сложности.

Ответ 2

Корзина с открытым исходным кодом Magento позволяет создавать собственные атрибуты для своих продуктов с использованием дизайна EAV. Вы можете проверить схему своей базы здесь.

Ответ 3

Я предлагаю вам взглянуть ближе на ORM Doctrine 2 с плагином OXM для него (https://github.com/doctrine/oxm). Он решит вашу проблему с разными атрибутами. Конечно, вам потребуется создавать индексы для пользовательских атрибутов, доступных для поиска, но я не думаю, что это будет проблемой:)

Если вас не интересует количество членов сообщества, вы также можете использовать MongoDB.