Характеристики относятся к товарам? То есть у одного товара только один набор характеристик или один товар может приходить и продаваться с разными наборами характеристик, например кроссовки адидас, цвет: Белый, размер: 37 и кроссовки адидас, цвет: Синий, размер: 39. Если второй, более сложный случай, то делаем следующие таблицы
1) Таблица
Properties (id, name, valueType) - здесь просто храним список возможных свойств
2) Таблица
PropertyValues (id, propertyId, value) - здесь храним возможные варианты значений для свойств, у которых не простой тип, то есть не строка, не число, не булево, не дата
3)
CharacteristicsSet (id, productId, name) - здесь будет храниться набор свойств для конкретной позиции товара на складе, name будет составляться автоматически как строка из свойств и их значений, указанных для позиции товара
4)
CharacteristicsValues (chartacteristicSetId, propertyId, valueType, value) - здесь будут храниться значения свойств для конкретной характеристики.
Например нам пришли партии кроссовок со свойствами цвет: белый, размер: 37й и цвет: синий, размер: 39й. (например 100 и 50 штук соответственно)
Тогда наши таблицы будут выглядеть следующим образом:
Properties:
id: 1, property: 'Цвет', valueType: 'set'
id: 2, property: 'Размер', valueType: 'number'
PropertyValues:
id: 1, propertyId: 1, value: 'Белый'
id: 2, propertyId: 1, value: 'Красный'
id: 3, propertyId: 1, value: 'Синий'
CharacteristicsSet:
id: 1, productId: 777, name: 'Цвет: белый, размер: 37'
id: 2, productId: 777, name: 'Цвет: синий, размер: 39'
CharacteristicsValues
chartacteristicSetId: 1, propertyId: 1, valueType: set, value: 1(ссылка на белый цвет)
chartacteristicSetId: 1, propertyId: 2, valueType: number, value: 37
chartacteristicSetId: 2, propertyId: 1, valueType: set, value: 2(ссылка на синий цвет)
chartacteristicSetId: 2, propertyId: 2, valueType: number, value: 39
Ну и в таблице склада можно будет хранить записи в виде:
productId: 777, characteristicsSetId: 1, quantity: 100
productId: 777, characteristicsSetId: 2, quantity: 50
Если же различный набор свойств для одного товара нам не нужен, то все то же самое, но обходимся без таблицы CharacteristicsSet: а в CharacteristicsValues ссылаемся на сам товар. Соответственно весь поиск будет проходить по одной таблице CharacteristicsValues с индексированными полями. Например чтобы найти любые товары с цветом Белый, мы делаем поиск
select * from CharacteristicsValues where propertyId = 1 and value = 1
ну и с соответствующим соединениям по таблицам характеристик и(или) товаров