Если значения дискретные, можно сделать так.
Сначала все денормализовать до упора.
Группы товаров
— ID
— Название
Товары:
— ID
— Название
Свойства
— ID
— Группа товаров
— Название
Значения свойств
— ID
— ID свойства
— Значение
Значения свойств товара
— ID
— ID товара
— ID свойства
— ID значения свойства
Уже можно добавлять, редактировать, искать как угодно и показывать. Правда запросы будут жуткие — сложные и медленные. Поэтому на этом этапе целесообразно получить прототип, отладить его, и перейти к нормализации.
— добавить к товарам сериализованные данные {Свойство: Значение свойства}
— добавить обработку сериализации при действиях: добавление, редактирование, отбражение
На этом этапе уже будет работать намного быстрее.
Теперь, если нужно сделать высоконагруженный сервис — добавить кеширующие индексы. Такие специальные таблицы:
— запрос
— сериализованный результат последней выборки
— флаг актуальности выборки
И добавить метод, пересчитывающий флаг актуальности выборки при добавлении и редактировании.
Если интерфейс навороченный, индексов должно быть столько же, сколько наворотов.
Двигайтесь последовательно, используйте SCRUM или хотя бы UML — тогда сделаете в течении дня.