Храню атрибуты и значения в Postgres поле jsonb в таблице товаров. При выборе чекбокса значения атрибута, нужно пересчитывать кол-во товаров у всех остальных значений фильтра, чтобы сделать неактивными те чекбоксы, в которых 0 товаров.
Такое реализовано в большинстве магазинов, или Яндекс Маркет, как пример.
Вопрос в том, как лучше пересчитывать эти значения?
Можно проходить по каждому значению атрибута и делать запрос.
Но если фильтр большой, то будет большое кол-во запросов.
Может есть более удачный вариант? Например взять все товары в массив (только данные jsonb поля), отфильтровать его и посчитать кол-во элементов?
Но если 40 атрибутов фильтра, то и фильтровать и считать исходный массив надо 40 раз. Не знаю будет ли это быстрее, чем считать в sql.
спасибо, тоже думал про Sphinx или Elasticsearch. Но и Postgres по индексируемым полям ищет довольно шустро. Вопрос, скорее, в том, что перебор всех свойств фильтра с запросом в базу (или в sphinx/elastic) это не правильно, наверняка есть алгоритм перебора такой, чтоб не делать это для каждого значения свойства. А путем какой-то перколдовки свойств, высчитать остальные математически.
Сергей Горностаев, нашел вариант получше, вместо того, чтобы делать запрос к каждому значению свойства, можно сделать запрос к свойству, с подсчетом количества значений. К примеру, если в фильтре выбран бренд 'Panasonic', для свойства цветов запрос будет таким:
SELECT attributes #>> '{"color"}' as color, count(*) as count
FROM products
WHERE attributes->>'brand' = 'Panasonic'
GROUP BY color;
Те цвета, которые сюда не попали, значит по ним нули и их закрываем от возможности поставить чекбокс.
Может быть можно как-то составить запрос так, чтобы за один запрос взять не только кол-во значений определенного свойства, а всех свойств сразу, сгруппированных по названию свойства, с выводом кол-ва товаров по каждому из значений этих свойств.
В общем, JSONB рулит конечно. Раньше подобное делал через EAV, разделяя по таблицам, там те еще заморочки с фильтрацией.