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


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

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

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

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

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

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

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

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

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

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

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

10 122

10 ответов:

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

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

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

Вариант 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 / 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 заключается в том, чтобы сохранять элементы с различными атрибутами в одном и том же "документе".

, где производительность не является основным требованием, так как в типа ЭТЛ применения ЭАВ имеет еще одно неоспоримое преимущество: дифференциальная сохраняет.

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

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

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

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

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

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

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

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

Я все еще голосую за моделирование на самом низком значимом атомном уровне для 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.