Верное решение, с теоретической точки зрения - это
дедуктивная база данных. У вас есть основная база данных с фактами о товарах (т.е. с их атрибутами), и вы на основе заданных правил строите новые
производные утверждения о вхождении того или иного товара в категорию.
Ваши категории - это по сути множества/классы, заданные при помощи предиката. Каждый ваш фильтр - это предикат вхождения товара во множество. Иерархия категорий - это обычное наследование классов. Для реализации наследования вам нужно про проверке предиката для категории-наследника проверять еще и все предикаты в родительских категориях. Тогда в категории "
2016" вы запишите условие "
год = 2016", а в дочерней категории женские напишите "
пол = ж", и оба условия следует проверять для каждого товара.
Таким образом, вам нужен какой-то простой язык или способ записи предикатов (возможно, вам захочется логических операторов
и/или/не), иерархия категорий, где к каждой категории привязан предикат на вышеуказанном языке, и движок, который будет выполнять привязку товаров к категориям, или даже, если товаров немного, запрашивать их на ходу, транслируя предикаты в SQL-фильтры (ну или другой язык запросов для базы, в которой у вас товары). У нас был проект - агрегатор товаров из интернет-магазинов, мы примерно так категории и делали. Даже успели впилить поддержку некоторых встроенных функций в предикатах, чтобы например можно было по части названия товара определять его в ту или иную категорию (или наоборот, исключать из категории, чтобы сантехнические прокладки отличать от всяких других).