Различные параметры для раздела товаров и поиск по ним

Владимир83

Новичок
Задача:
Есть разделы продукции в них соответсвенно товары.
В разных разделах различный набор параметров, по которым происходит фильтрация товаров в данном разделе.

Мои размышления:
Пока без того условия что параметры могут быть разными: число, список,текст и т.п.
------------------
1) сделать просто в таблице кучу полей под каждый параметр.

Плюсы:
Самый простой вариант, легко сделать добавление, легко сделать фильтр.

Минус:
такое подойдет только если параметров какое то конечное число и то не очень большое, и известны сразу все.
------------------
2) Создать список параметров (отдельную таблицу).
у каждого раздела выбрать нужные параметры (тут получается ограничиваем кол-во парамтров у раздела - допустим 30 штук должно хватит почти под все)
у таблицы товаров делаем 30 полей param1, param2 .....

Плюсы:
в принципе тут все хорошо, куча параметров, добавление сделать не сложно, ну и фильтр тоже реализовать просто.

Минусы:
-тут товар без категории теряет свои параметры т.е. я не смогу товар из одного раздела перенести в другой раздел (даже если набор параметров будет один и тотже, просто в другом порядке)
так как в одной категории первый параметр у товара будет "вес", а в другой "высота"
- если у раздела удалить допустим один параметр например 4 параметр "Вес" и потом добавить новый параметр "Высота" - у всех товаров получится путаница так как в param4 у них забиты данные по весу.
т.е. тут как то нужно жестко регулировать удаление изменение параметров у раздела.
- если будут разные типы у параметров нужно уже как то разграничивать поля param у товара, т.е. далать например 15 int, 15 varchar- и все вытекающие отсюда проблемы при реализации

------------------
3) Создать список параметров(отдельную таблицу).
у каждого раздела выбрать нужные параметры - тут вообще без ограничений.
у товара все значения параметров будут хранится в отдельной таблице goods_param{good_id, param_id, value}

Плюс: максимальная универсальность

Минусы:
-Сложно реализовать добавление.
-Как реализовать фильтр не соображу толком, городить кучу селектов с выбором из талицы goods_param значение good_id чтобы потом их подставить в выборку из таблицы goods.
Все как то грамоздко и не понятно как быстро будут работать такие запросы если данных будет много.

====================
Это все еще не учитываю что параметры могут быть разных типов.

Помогите кто уже сталкивался или реализовавал такое.
 

С.

Продвинутый новичок
Второй вариант выкинуть, это несуразица какая-то. Все остальное правильно. Как делать -- выбирать тебе.
 

Владимир83

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

С.

Продвинутый новичок
На сколько коряво сделаешь, на столько медленно и будет. "Обычную" выборку тоже при желании можно сделать так, что подвисать будет.

И кастати, в третьеэм варианте ничего такого "необычного" нет. Выборка как выборка.
 

Владимир83

Новичок
вот такая выборка насколько корява?
select * from goods where id in ( select good_id from goods_param where param_id = 1 and value=10)

можешь подсказать как сделать выборку по 2 параметрам например?
 

Gas

может по одной?
join goods_param + where (cond1) OR (cond2) + group by id having count(*)=2
 

Gas

может по одной?
ну или так, только версии mysql до 5.5, бывает выполняют вложенный запрос для каждой внешней строки, а не один раз
 

Gas

может по одной?
Код:
select g.* 
from goods as g
join goods_param as p on g.id=p.good_id
where (cond1) OR (cond2) 
group by g.id having count(*)=2
или

Код:
select g.* 
from (
  select good_id
  from goods_param
  where (cond1) OR (cond2) 
  group by good_id having count(*)=2
) as p
join goods as g.id=p.good_id
 

Владимир83

Новичок
Код:
select g.* 
from goods as g
join goods_param as p on g.id=p.good_id
where (cond1) OR (cond2) 
group by g.id having count(*)=2
или

Код:
select g.* 
from (
  select good_id
  from goods_param
  where (cond1) OR (cond2) 
  group by good_id having count(*)=2
) as p
join goods as g.id=p.good_id
огромное спасибо, реализовал третий метод, осталось по мелочи внедрить.

кстати из этих двух запросов второй работает в 5 раз быстрее.
а так как я писал через in() сервак наглухо виснит, так что еще раз огромное спасибо.
 
Сверху