Хранение атрибутов товаров

102
27 ноября 2019, 11:00

Задача может быть тривиальна, но споров в сети много. Есть желание сделать свой интернет магазин. И встал вопрос о хранении неограниченного количества свойств товаров. Много читал про EAV, но как-то выглядит топорно и с поиском и фильтрами могут возникнуть сложности (не беру в расчет elasticsearch и пр.). Смотрел механизмы нескольких CMS.

Например, в open cart используется EAV, а для фильтров отдельные метки, что добавляет трудностей при администрировании такого магазина. У magento некое подобие расширенного EAV только я не понял как оно делает выборки, ведь для каждой такой операции потребуется сделать 4-5 джойнов, в зависимости от кол-ва типов свойств(int, float, date и пр.).

Понравился механизм хранения свойств в Битриксе, но я не совсем понимаю как там получить множественные свойства (несколько запросов?). Можете объяснить как лучше организовать такое хранение данных? Если не трудно, то с примерами запросов.

Answer 1

EAV архитектура позволяет хранить и обрабатывать большие объемы данных без проблем. Все будет больше упираться в операции чтения/записи при больших нагрузках на сайт, ведь при записи/транзакциях таблицы блокируются, если речь больше о чтении, то грамотная настройка БД будет давать хороший результат даже на чистой EAV. Конечно же все зависит еще и от объема хранимых данных, но и линейная раскладка от них тоже зависит. Более того, EAV после определенного размера дает более быстрые результаты, чем широкая и большая линейная таблица.

Не скажу на счет других CMS, но EAV в Magento как правило используется именно для хранения данных (считай для админки). Для фронта используется несколько дополнительных слоев, чтобы сделать его более быстрым и доступным:

  • Flat index - линейная таблица, в которую раскладываются все значения, которые нужно использовать / отображать в листинге товаров, чтобы быстро их получать не делая много JOIN по EAV
  • Attribute (EAV) index - это индекс фильтров. Тоже своеобразная раскладка с всевозможными id опций ваших атрибутов + группировка для разных типов товаров
  • Search index - для поиска обычного стандартного Fulltext / Like

Если у вас фильтров и/или товаров переваливает за некое значение, то тут уже MySQL начнет подгребать на любых таблицах и это не зависит от CMS. Решается либо переездом на более мощное железо, тюнингом MySQL, либо переносом каталога+поиска+фильтров на Elasticsearch / Sphinx.

Если же ваша цель именно иметь много свойств у товаров, но не использовать как фильтры, то еще можно поискать решение с поддержкой графовых БД под эти цели. Уверен что модули для этого найдутся под многие CMS.

READ ALSO
Создать запрос для базы MYSQL имея готовую бд

Создать запрос для базы MYSQL имея готовую бд

Есть огромная бд с кучей таблицМне нужно составить sql запрос, чтобы создать точно такую же бд

98
Локальный запуск google-app-engine с MySQL

Локальный запуск google-app-engine с MySQL

Не получается никак запустить локальный сервер google-app-engine с использованием базы MySQL

114
Подскажите как сверстать полукруг

Подскажите как сверстать полукруг

Подскажите как сверстать этот зеленый полукругСейчас он сделан на clip-path, но у него плохая поддержка

127