Мужики помогите советом. Не пойму, как грамотней реализовать характеристики у товаров. Есть инет магазин одежды и пока он был магазином одежды проблем не было))
Таблицы MYSQL (innodb):
1) products (id, name, price...)
2) attribute (id, id_product, id_color, id_size) //id_color и id_size могут быть NULL.
3) colors (id, name)
4) sizes (id, name)
Я давно, на других сайтах, практикую паттерн, по моему называется EAV. Там легко прикрутить любой параметр к товару. А у меня 2-я таблица всю гибкость съела.
Новая логика магазина такая:
1) у товара может и не быть параметра (EAV подходит)
2) у товара может быть цвет или размер по отдельности (EAV подходит)
3) Некоторые параметры должны быть в связке, например цвет-размер) а вот тут уже ломается EAV (или требует пересмотра структуры) с этим пунктом как раз загвоздка((
Моя таблица attribute объединяет цвет и размер, но если параметров будет больше? Можно конечно сделать 5-ю таблицу attribute_items в неё добавлять параметры, а таблицу attribete использовать как всязку атрибут-группа. Но по моему запутано. Может у вас есть мысли, как в паттерн EAV внедрить связи между параметрами и уйти от моей 2-й таблицы attribute.
maximka787: вы говорите одно, подразумеваете обратное. Никакой связи между цветом и размером нет. Это просто аттрибуты товара. Так что у вас типичное EAV.
Вам уже дали ссылку на мою статью, можете хранить все ваши аттрибуты в EAV а фильтровать их по кешу в редисе. Если будут вопросы - можете спокойно тут спрашивать.
evnuh: вообще все товары в сфере одежды имеют и цвет и размер. Все товары. Изучив множество xml файлов выгрузки, всегда картина одинаковая. Куртка красная XS это один товар. Таже куртка красная L это другой товар и артикул там другой.
Артём Петренков: тоесть как таблицу артикулов оставить attribute, а цвет и размер вытащить в пятую таблицу по схеме EAV (id, id_attribute, param, val)?
Вы еще на этапе хранения задумались....
А каково будет по множественным фильтрам делать отбор?
А с тем, чтобы показывать покупателю, а сколько товаров после применения одного или двух фильтров? И с отключением после этого ненужных (невозможных) фильтров?
Зачем вы вообще это делаете на sql? https://habrahabr.ru/post/261137/
или https://habrahabr.ru/post/186572/
или https://habrahabr.ru/post/132118/
Сейчас речь о хранении, тк я люблю работать с кэш таблицами, которые заполняютя при добавлении товара сразу. Да и у меня бд InnoDB, как сайтам чаще и пологается)
maximka787:
если все в кэше, то то более зачем MySQL, а уж тем более с InnoDB? Можно хранить в том формате, что можно быстрее прочитать в кэш. Хоть в текстовом.
maximka787: если вам чисто для хранения и оптимизация выборки данных не имеет значения, то таблицы colors и sizes не нужны.
таблица атрибутов присвоенных товару превращается в
id_product, id_attribute_name, attribute_value
и еще 1 таблица для хранения имен атрибутов, которая будет состоять для начала из 2 записей.
с другой стороны, если расширение количества атрибутов будет осуществлять только программист, а не пользователь, то можно обойтись и без таблицы для имен атрибутов.