Есть таблицы categories, products, props, props_value, приведу простой пример:
таблица categories - id, name
таблица products - id, name, price
таблица props - id, name
таблица props_value - prop_id, product_id, value
У каждой категории будет свой набор товаров соответственно разные значения фильтров. Хочу что бы в фильтре в категории выводились только те свойства и значения которые есть у товаров этой категории. Для этого думаю сделать следующую таблицу categories_meta - id, category_id, prop_name, variants(json),
эту табличку будет генерировать воркер допустим 1 раз в день, таким образом я получил все варианты свойст и значений для категории 1 дополнительным запросом в эту таблицу.
Но в текущей реализации мне не понятно как делать диф когда фильтром воспользовались, мне ведь нужно сделать варианты значений которые не подходят уже в выбранные свойства неактивными.
Допустим пользователь выберет свойство "Цвет:красный:зеленый" и мне вернется 20 элементов из продуктов тут мне понятно как сделать, а если результатов будет не 20 а 20000 или больше, это же не разумно делать выборку 20к продуктов делать диф а потом делать еще 1 запрос в базу только уже с пагинацией.
Скажите как эту проблему можно решить, и насколько адекватное такое решения?
Заранее прошу прощения за нечеткое изложения мыслей.
Зачем? Если делаете денормализацию - нужно очень хорошо представлять себе зачем вы это делаете, и чем придется за это платить.
Немножко непонятно по вашему описанию - свойства привязаны напрямую к продуктам, а по категории невозможно определить список доступных свойств? Как вообще это работает, можно любому продукту любое свойство навесить?
Цвет:красный:зеленый - это я как пример указал что пользователь в фильтре выбрал два значения для свойства цвет.
Нет свойства не привязаны к продуктам список свойств хранится в таблицу props, значения хранятся в таблице props_value(
prop_id - это ид строки из таблицы props ,
product_id - это ид продукта из таблицы products,
value - это значения для этого свойства
)
Может подскажите более правильный пример реализации фильтра?
select * from protuct where id in (
select product_id from props_value p1
inner join props_value p2 on p1.product_id=p2.product_id
where p1 зеленый и p2 красный
)
Stalker_RED, как сделать запрос с выбранными свойствами мне понятно.
Мне не понятно как мне отобразить/выбрать все доступные свойства и их значения для конкретной категории, и как делать диф между доступными свойствами для категории и уже выбранными товарами при использовании фильтра.
Stalker_RED, я могу добавить в таблицу props поле category_id, но тогда будет другая проблема, к примеру есть свойство цвет и у него 30 вариантов значений, и в категории ШАПКИ у меня есть только 3 вида цвета зачем мне выводить все 30 цветов в этой категории, по этому мне не нравится идея с привязкой пропса к категории.
Александр Заплитный, а у меня не просто цвет, а цвет_шапок, и у него только три доступных значения, и нет этой проблемы.
Вы поймите, телепатия пока плохо прокачана, а вашу базу я не вижу, и вы ее описать не хотите.