Чтобы не громоздить тонны колонок и делать по канонам 3 нормальной формы — разделяют сущности, атрибуты и их значения отдельно.
Свойства обычно хранят отдельно( у них могут быть свои поля)
а значения к ним тоже отдельно (EAV)
product_id, feature_id, value
(где featured_id — id свойства из таблички выше)
пример с моего интернет-магазина — 1 товар, много характеристикПример запроса:SELECT p.id, p.url, p.name
FROM e_products p
WHERE 1
AND p.id in (SELECT product_id FROM e_options WHERE feature_id=8 AND value in('Бежевый','Белый') )
AND p.id in (SELECT product_id FROM e_options WHERE feature_id=1 AND value in('Лето 2011') )
время выполнения запроса — 0.019 s для 10 тыс товаров, 100тыс значений свойств и десятка свойств
В запросе два параметра фильтра (1 значение коллекции и 2 значений цвета, выше можете увидеть в табличке)
как понимаете — строку с нужным свойством подставляете в зависимости от GET запроса...
* Можно упростить — вместо
feature_id
хранить сразу название параметра, но лучше сразу разделите... чтобы можно было параметру поставить напрмиер поле включать или нет его в фильтр и задать порядок, или нужно будет выводить поля в саму форму фильтра (гонять большую таблицу — так себе решение)