База данных значений атрибутов сущностей и строгая реляционная модель электронной коммерции

можно с уверенностью сказать, что EAV / CR модель базы данных-это плохо. Что сказал:

вопрос: какую модель базы данных, методику или шаблон следует использовать для работы с "классами" атрибутов, описывающих продукты электронной коммерции, которые могут быть изменены во время выполнения?

в хорошей базе данных электронной коммерции вы будете хранить классы опций (например, разрешение телевизора, тогда есть разрешение для каждого телевизора, но следующий продукт может не быть телевизором и не иметь " телевизор разрешение.)" Как вы их храните, эффективно выполняете поиск и позволяете пользователям настраивать типы продуктов с переменными полями, описывающими их продукты? Если поисковая система обнаружит, что клиенты обычно ищут телевизоры на основе глубины консоли, можно добавить глубину консоли в поля, а затем добавить одну глубину для каждого типа ТВ-продукта во время выполнения.

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

дальнейшего обсуждения:

короче говоря,есть ли какие-либо ссылки в Интернете или описания моделей, которые могут "академически" исправить следующую настройку? Я благодарю Ноэля Кеннеди за предложение таблицы категорий, но потребность может быть больше. Я описываю это по-другому ниже, пытаясь подчеркнуть значение. Мне может потребоваться коррекция точки зрения для решения проблемы, или мне может потребоваться углубиться в EAV/CR.

любите положительный ответ на модель EAV/CR. Мои коллеги-разработчики все говорят, что Джеффри Кемп коснулся ниже: "новые объекты должны быть смоделированы и спроектированы профессионал " (вырвано из контекста, читайте его ответ ниже). Проблема:

  • сущности еженедельно добавляют и удаляют атрибуты
    (ключевые слова поиска диктуют будущие атрибуты)
  • новые объекты прибывают еженедельно
    (продукты собраны от частей)
  • старые сущности уходят еженедельно
    (заархивировано, менее популярно, сезонно)

клиент хочет добавить атрибуты к продуктам по двум причинам:

  • отдел / поиск по ключевым словам / диаграмма сравнения между like products
  • конфигурация потребительского продукта перед оформлением заказа

атрибуты должны иметь значение, а не только поиск по ключевым словам. Если они хотят сравнить все торты, которые имеют "взбитые сливки глазурь" , они могут нажать торты, нажмите тему дня рождения, нажмите взбитые сливки глазурь, а затем проверить все торты, которые интересны зная у всех есть взбитые сливки. Это не специфично для тортов, просто пример.

10 ответов


есть несколько общих плюсов и минусов, о которых я могу думать, есть ситуации, когда один лучше другого:

Вариант 1, Модель EAV:

  • Pro: меньше времени для разработки и разработки простого приложения
  • Pro: новые объекты легко добавить (может даже быть добавлены пользователями?)
  • Pro: "общие" компоненты интерфейса
  • минусы: сложный код, необходимый для проверки простых типов данных
  • Con: гораздо сложнее SQL для простых отчеты
  • Con: сложные отчеты могут стать почти невозможно!--8-->
  • Минусы: Низкая производительность для больших наборов данных

Вариант 2, моделирование каждого объекта в отдельности:

  • Con: больше времени, необходимого для сбора требования и дизайн
  • Con: новые объекты должны быть смоделированы и разработанный профессионалом
  • Con: пользовательские компоненты интерфейса для каждого сущность
  • Pro: тип данных ограничения и проверка просты в реализации
  • Pro: SQL легко писать, легко понять и отладить
  • Pro: даже самые сложные отчеты относительно просты
  • Pro: лучшая производительность для больших наборов данных

Вариант 3, Комбинация (объекты модели "правильно", но добавьте "расширения" для пользовательских атрибутов для некоторых/всех объектов)

  • Pro / Con: больше времени необходимо собрать требования и конструировать чем Вариант 1, но, возможно, не так много, как вариант 2 *
  • Con: новые объекты должны быть смоделированы и разработаны профессионалом
  • Pro: новые атрибуты могут быть легко добавлены позже
  • минусы: сложный код, необходимый для проверки простых типов данных (для пользовательских атрибутов)
  • Con: компоненты пользовательского интерфейса по-прежнему требуются, но общие компоненты интерфейса могут быть возможны для пользовательских атрибутов
  • Con: SQL становится сложным, как только любой пользовательский атрибут включен в отчет
  • Con: хорошая производительность в целом, если вы не начинаете искать или сообщать по пользовательским атрибутам

* я не уверен, что Вариант 3 Обязательно сэкономит время на этапе проектирования.

лично я бы склонялся к варианту 2 и избегал подслушивания, где это возможно. Однако для некоторых сценариев пользователям нужна гибкость, которая поставляется с EAV; но это связано с большими затратами.


можно с уверенностью сказать, что модель базы данных EAV/CR плоха.

нет, это не так. Это просто неэффективное использование реляционных баз данных. Чисто хранилище ключей / значений отлично работает с этой моделью.

теперь, к вашему реальному вопросу: Как сохранить различные атрибуты и сохранить их для поиска?

просто используйте EAV. В вашем случае это будет один дополнительный стол. индексируйте его как по имени атрибута, так и по значению, большинство СУБД будет использовать префикс-сжатие до повторений имени атрибута, что делает его очень быстрым и компактным.

EAV / CR становится уродливым, когда вы используете его для замены "реальных" полей. Как и с каждым инструментом, чрезмерное использование его "плохо" и дает ему плохой образ.


// At this point, I'd like to take a moment to speak to you about the Magento/Adobe PSD format.
// Magento/PSD is not a good ecommerce platform/format. Magento/PSD is not even a bad ecommerce platform/format. Calling it such would be an
// insult to other bad ecommerce platform/formats, such as Zencart or OsCommerce. No, Magento/PSD is an abysmal ecommerce platform/format. Having
// worked on this code for several weeks now, my hate for Magento/PSD has grown to a raging fire
// that burns with the fierce passion of a million suns.

http://code.google.com/p/xee/source/browse/trunk/XeePhotoshopLoader.m?spec=svn28&r=11#107

внутренние модели в лучшем случае дурацкие, как кто-то положил схему в игру boggle, запечатал это и положил его в краскораспылитель...

реальный мир: я работаю над приложением для выполнения midware, и вот один из запросов для получения адресной информации.

CREATE OR REPLACE VIEW sales_flat_addresses AS
SELECT sales_order_entity.parent_id AS order_id, 
       sales_order_entity.entity_id, 
       CONCAT(CONCAT(UCASE(MID(sales_order_entity_varchar.value,1,1)),MID(sales_order_entity_varchar.value,2)), "Address") as type, 
       GROUP_CONCAT( 
         CONCAT( eav_attribute.attribute_code," ::::: ", sales_order_entity_varchar.value )
         ORDER BY sales_order_entity_varchar.value DESC
         SEPARATOR '!!!!!' 
       ) as data
  FROM sales_order_entity
       INNER JOIN sales_order_entity_varchar ON sales_order_entity_varchar.entity_id = sales_order_entity.entity_id
       INNER JOIN eav_attribute ON eav_attribute.attribute_id = sales_order_entity_varchar.attribute_id
   AND sales_order_entity.entity_type_id =12
 GROUP BY sales_order_entity.entity_id
 ORDER BY eav_attribute.attribute_code = 'address_type'

выводит адресную информацию для заказа, лениво

--

резюме: используйте только Magento, если:

  1. вы получили большие мешки денег!--20-->
  2. вы должны
  3. наслаждайтесь боль

Я удивлен, что никто не упомянул базы данных NoSQL.

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


где представление нет главного требования, как в типе ETL применения, EAV имеет другое определенное преимущество: дифференциал сохраняет.

я реализовал ряд приложений, где чрезмерным требованием была возможность видеть историю объекта домена от его первой "версии" до его текущего состояния. Если этот объект домена имеет большое количество атрибутов, это означает, что каждое изменение требует вставки новой строки в соответствующую таблицу (а не обновления потому что история будет потеряна, но вставка). Предположим, этот объект домена-человек, и у меня есть 500k человек, чтобы отслеживать в среднем 100+ изменения в течение жизненного цикла людей к различным атрибутам. Соедините это с тем фактом, что редким является приложение, которое имеет только 1 основной объект домена, и вы быстро предположите, что размер базы данных быстро выйдет из-под контроля.

простым решением является сохранение только дифференциальных изменений в основных объектах домена вместо многократного сохранения избыточной информации.

все модели меняются со временем, чтобы отразить новые потребности бизнеса. Период. Использование EAV-это только один из инструментов в нашей коробке; но он никогда не должен автоматически классифицироваться как"плохой".


Я борюсь с той же проблемой. Вам может быть интересно ознакомиться со следующим обсуждением двух существующих решений для электронной коммерции: Magento (EAV) и Joomla (регулярная реляционная структура): https://forum.virtuemart.net/index.php?topic=58686.0

похоже, что производительность подслушивания Magento-настоящий showstopper.

вот почему я склоняюсь к нормализованной структуры. Чтобы преодолеть недостаток гибкости, я думаю о добавлении некоторых отдельный словарь данных в будущем (XML или отдельные таблицы БД), которые могут быть отредактированы, и на основе этого будет создан код приложения для отображения и сравнения категорий продуктов с новым набором атрибутов вместе со сценариями SQL.

такая архитектура, похоже, является сладким пятном в этом случае-гибким и в то же время эффективным.

проблема может быть частым использованием ALTER TABLE в живой среде. Я использую Postgres, поэтому его MVCC и транзакционные DDL, надеюсь, облегчит боль.


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


Если речь идет только об атрибутах каталога продуктов и, следовательно, требования к проверке этих атрибутов довольно ограничены, единственным реальным недостатком EAV является производительность запроса, и даже это только проблема, когда ваш запрос имеет дело с несколькими "вещами" (продуктами) с атрибутами, производительность для запроса "дайте мне все атрибуты для продукта с идентификатором 234" в то время как не оптимально все еще достаточно быстро.

одним из решений является использование модели SQL database / EAV только для admin / edit сторона каталога продуктов и имеет некоторый процесс, который денормализует продукты во что-то, что делает его доступным для поиска. Поскольку у вас уже есть атрибуты и, следовательно, скорее всего, вы хотите огранку, это может быть Solr или ElasticSearch. Этот подход позволяет избежать в основном всех недостатков модели EAV, а добавленная сложность ограничивается сериализацией полного продукта в JSON при обновлении.


У EAV много недостатков:

  1. снижение производительности с течением времени Как только объем данных в приложении превысит определенный размер, извлечение и манипулирование этими данными, вероятно, будет становиться все менее и менее эффективным.
  2. запросы SQL очень сложны и трудны для записи.
  3. проблемы с целостностью данных. Вы не можете определить внешние ключи для всех необходимых полей.
  4. вы должны определить и поддерживать свои собственные метаданные.

У меня есть немного другая проблема: вместо многих атрибутов с разреженными значениями (что, возможно, является хорошей причиной для использования EAV), я хочу сохранить что-то вроде электронной таблицы. Столбцы в листе могут меняться, но внутри листа все ячейки будут содержать данные (не разреженные).

Я небольшой набор тестов для сравнения двух проектов: один с помощью EAV, а другой с помощью массива Postgres для хранения ячейки данные.

ЕАВ enter image description here

массив enter image description here

обе схемы имеют индексы на соответствующих Столбцах, и индексы используются планировщиком.

получилось схема на основе массива была на порядок быстрее для вставок и запросов. Из быстрых тестов показалось, что оба масштабируются линейно. Хотя тесты не очень тщательные. Предложения и вилки добро пожаловать - они под лицензией MIT.