Категории товаров

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Никита096
Сообщения: 28
Зарегистрирован: 2017.02.01, 17:23

Категории товаров

Сообщение Никита096 »

Как более рекомендовано оформлять архитектуру категорий товаров?
Более конкретные вопросы:
1. Какие таблицы использовать?
  • делаю таблицу категорий, где поля - id, parent_id, alias;
  • таблицу продуктов и таблицу значений, где я полагаю нужно будет использовать паттерн EAV;
  • есть функция, которая бежит по категориям и формирует дерево категорий с childs.
2. Для вывода вертикального меню категорий идеально подходит рекурсия, т.к. (ul>li). А что насчет горизонтального, ведь там могут использоваться элементы dropdown? Что-то мне подсказывает что foreach (-ем) бегать по категориям, а потом по их childs, и засовывать следующие уже в dropdown и т.д. не очень хороший вариант.
3. Как вывести все товары дочерних категорий при выборе какой-то основной? Перебирать все childs у этой категории и выводить товары для каждой из них? Опять же возникают сомнения, т.к. код усложняется циклами.
4. Как реализовать ЧПУ по алиасам?
5. Существует ли расширение, для второй версии фреймворка, которое избавит от головной боли?

Очень хочется узнать, как строят подобную архитектуру и свои решения профи.
Последний раз редактировалось Никита096 2017.03.20, 19:10, всего редактировалось 1 раз.
Никита096
Сообщения: 28
Зарегистрирован: 2017.02.01, 17:23

Re: Категории товаров

Сообщение Никита096 »

Дольше формулировал...
Видео давно перед глазами было, но внимания не обращал как-то:)
Спасибо огромное!
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Категории товаров

Сообщение anton_z »

Не советую eav. Огребете при интеграции с другими магазинами (испорт, экспорт товаров и т. д.). Если не пишете cms, в eav нет никакого толку. На дворе 2017. Используйте json вместе с postgres или elasticsearch
Matvik
Сообщения: 194
Зарегистрирован: 2013.06.21, 02:32

Re: Категории товаров

Сообщение Matvik »

anton_z писал(а): 2017.02.06, 13:15 Не советую eav. Огребете при интеграции с другими магазинами (испорт, экспорт товаров и т. д.). Если не пишете cms, в eav нет никакого толку. На дворе 2017. Используйте json вместе с postgres или elasticsearch
Можно поподробнее?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Категории товаров

Сообщение samdark »

EAV — гибкая структура, но не без минусов. При возрастании числа полей и контента оно начинает ощутимо проседать по производительности.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Категории товаров

Сообщение anton_z »

Matvik писал(а): 2017.03.10, 15:54
anton_z писал(а): 2017.02.06, 13:15 Не советую eav. Огребете при интеграции с другими магазинами (испорт, экспорт товаров и т. д.). Если не пишете cms, в eav нет никакого толку. На дворе 2017. Используйте json вместе с postgres или elasticsearch
Можно поподробнее?
Я считаю, что EAV устарел и все. Это была суррогатная, нереляционная схема, которую засунули в РСУБД. База даннных внутри базы данных. И дело даже не в производительности, а в смешивании метаданных с данными, потере информации о типах данных. Как по EAV атрибуту сделать сортировку? Это боль. Ведущие специалисты в области РСУБД считают EAV антипаттерном (Билл Карвин, например). В интернете полно информации по этим вопросам. Для решения задач, которые решал EAV сейчас есть гораздо более вменяемые альтернативы, чем раньше - json-типы в РСУБД. Для поиска есть gin/gist в postgres, в MySQL есть виртуальные колонки. Поддержка json есть в сфинксе, или можно использовать elasticearch (ну не на виртуальном хостинге, разумеется, VPS подойдут).

Касательно обозначенных проблем интеграции. Представьте ситуацию, что вы делаете интеграцию с другими магазинами, всякие загрузки/выгрузки через API. С EAV у вас не получится версионирование API ввода/вывода атрибутов товаров и любое изменение набора атрибутов админом может сделать неисправными все программы, написанные сторонними программистами на ваш API.
Matvik
Сообщения: 194
Зарегистрирован: 2013.06.21, 02:32

Re: Категории товаров

Сообщение Matvik »

А можно ссылку на пример реализации динамических аттрибутов через JSON-поля?
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Категории товаров

Сообщение rugabarbo »

Тема больше про категории, нежели про EAV, поэтому дам две ссылки:
1. https://github.com/creocoder/yii2-nested-sets
2. https://github.com/paulzi/yii2-materialized-path

Что касается EAV – он позволяет сохранить стэк в пределах MySQL + PHP. Это может быть важным для бюджета компании и сроков реализации.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Категории товаров

Сообщение anton_z »

rugabarbo писал(а): 2017.03.11, 20:19 Тема больше про категории, нежели про EAV, поэтому дам две ссылки:
1. https://github.com/creocoder/yii2-nested-sets
2. https://github.com/paulzi/yii2-materialized-path

Что касается EAV – он позволяет сохранить стэк в пределах MySQL + PHP. Это может быть важным для бюджета компании и сроков реализации.
С json и без EAV можно сохранить тот же стек.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Категории товаров

Сообщение rugabarbo »

anton_z писал(а): 2017.03.12, 00:58С json и без EAV можно сохранить тот же стек.
Объективно:
* JSON в MySQL не поддерживает индексы
* ORM для JSON в Yii2 не реализована: https://github.com/yiisoft/yii2/issues/10436

ИМХО:
* синтаксис JSON-выборок в MySQL отстойный
* на рынке труда мало специалистов, работавших с этим типом данных в MySQL

Поэтому, имхо, проще-таки хранить EAV в MySQL в старых добрых таблицах...
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Категории товаров

Сообщение anton_z »

можно индексировать json в MySQL создавая виртуальные колонки. Однако это ALTER TABLE. Если нужна одна база для хранения и поиска, то лучше postgres.

http://mysqlserverteam.com/indexing-jso ... l-columns/
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Категории товаров

Сообщение rugabarbo »

Итого, json вместо таблиц в MySQL - это шило на мыло для EAV.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Категории товаров

Сообщение ElisDN »

anton_z писал(а): 2017.03.12, 04:27 Можно индексировать json в MySQL создавая виртуальные колонки. Однако это ALTER TABLE.
При индексировании упираемся на лимит 32 индекса на таблицу. И на тормоза при их перестроении.

И тогда зачем вообще JSON, если можно для атрибутов сразу делать колонки attr_* через ALTER TABLE С полноценным контролем типов?
anton_z писал(а): 2017.03.12, 04:27 Это была суррогатная, нереляционная схема, которую засунули в РСУБД
Вместо этого теперь получаем проблемы нереляционных БД с отсутствием контроля целостности и необходимостью поштучного обновления JSON-полей всех строк в цикле.
anton_z писал(а): 2017.03.12, 04:27 ...потере информации о типах данных
Сделайте поля value_str, value_int, value_date вместо одного общего value. И заполняйте, фильтруйте и сортируйте в зависимости от типа атрибута.
anton_z писал(а): 2017.03.12, 04:27 Как по EAV атрибуту сделать сортировку? Это боль.
Одним JOIN-ом сортируемого значения:

Код: Выделить всё

Product::find()
    ->alias('p')
    ->innerJoin(['sort_value' => Value::tableName()], 'sort_value.product_id = p.id')
    ->andWhere(['sort_value.attr_id' => $attr->id])
    ->orderBy('sort_value.value_' . $attr->type)
Для импорта (что бывает редко) удобнее сразу сериализовать в JSON. А для повседневной работы EAV или EA+JSON - это на любителя.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Категории товаров

Сообщение anton_z »

ElisDN писал(а): 2017.03.12, 10:20
anton_z писал(а): 2017.03.12, 04:27 Это была суррогатная, нереляционная схема, которую засунули в РСУБД
Вместо этого теперь получаем проблемы нереляционных БД с отсутствием контроля целостности и необходимостью поштучного обновления JSON-полей всех строк в цикле.
Есть postgres, где все это решено.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Категории товаров

Сообщение ElisDN »

anton_z писал(а): 2017.03.12, 15:27 Есть postgres, где все это решено.
Что именно там решено из "контроля целостности в JSON" и "поштучного обновления JSON-полей в цикле"?
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Категории товаров

Сообщение anton_z »

Там решена проблема индексирования JSON-колонок. Я считаю что это основной критерий при использовании JSON-типов в РСУБД.
EAV - гораздо более громоздкая вещь и JSON-колонки как раз разработаны ему на смену. Я не говорю про mongo и прочие нереляционные вещи. ACID желателен почти всегда. Postgres нам дает JSON с индексами и ACID.
Да, массового UPDATE на JSON не сделать, но он далеко не всегда и нужен. Где-то нужно платить. Часто приходится делать массовые UPDATE на EAV?

Добавлю, что JSON гораздо удобнее, если вам нужно проиндексировать вашу БД в какой-то сторонней системе поиска, типа sphinx или, что лучше, elasticsearch/solr. С EAV там будет немного труднее. Хотя я индексировал)
ElisDN писал(а): 2017.03.12, 16:45 Что именно там решено из "контроля целостности в JSON" и "поштучного обновления JSON-полей в цикле"?
Что имеете ввиду под "контролем целостности" применительно к JSON?
AlexCereus
Сообщения: 13
Зарегистрирован: 2017.02.09, 21:06

Re: Категории товаров

Сообщение AlexCereus »

samdark писал(а): 2017.03.10, 17:09 EAV — гибкая структура, но не без минусов. При возрастании числа полей и контента оно начинает ощутимо проседать по производительности.
Подскажите, а какие есть альтернативы EAV?
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Категории товаров

Сообщение anton_z »

AlexCereus писал(а): 2017.07.13, 11:07
samdark писал(а): 2017.03.10, 17:09 EAV — гибкая структура, но не без минусов. При возрастании числа полей и контента оно начинает ощутимо проседать по производительности.
Подскажите, а какие есть альтернативы EAV?
Смотря какая задача.

EAV нужно для тиражных решений - если пишете CMS (лучше этого не делать) на которой потом будет куча сайтов и есть ограничения на используемый софт. Как правило это то, что есть на виртуальных хостингах - mysql. Пример - magento.


Для кастомных проектов, где есть постоянные программисты, лучше без EAV и админки на нее. Быстрее пишется, быстрее работает, надежнее. Кастомные атрибуты сохраняете в БД в json или hstore или blob. Если БД не умеет индекировать эти поля, другим процессом (это важно!) индексируете в эластик или сфинкс.
AlexCereus
Сообщения: 13
Зарегистрирован: 2017.02.09, 21:06

Re: Категории товаров

Сообщение AlexCereus »

anton_z писал(а): 2017.07.13, 13:26 Смотря какая задача.
Проект не тиражный, но постоянных программистов у заказчика не будет.
Коротко: у товаров в каталоге есть категории. И в зависимости от категории у товаров может быть разный набор свойств, по которым можно будет осуществить фильтрацию.
Набор свойств для разных категорий в данный момент не известен, и скорее всего не будет известен никогда, так как хотелки могут меняться. Поэтому я ищу способ задать эту гибкость для админа.

Если я правильно понял, то без EAV мне не обойтись. Просто меня "расстроило", что производительность просядет и думал, что есть какая-то альтернатива этого избежать.
Ответить