Посмотрите в сторону EAV. Это подход, когда у вас в таблице товаров только самые базовые характеристики, такие как наличие, цена, а специфические хранятся в отдельной таблице, где каждая строка это одно свойство. Ну и ещё одна таблица для названий характеристик. Примерно вот так:
goods{id, name, price}
attribute{id, name}
attribute_value{id, id_attr, id_good, value}
Тут возможны некоторые варианты связанные с типом данных атрибута. Т.е. может быть одна таблица со значениями атрибутов и в ней есть поля как для строкового значения, так и для числового и даты например. А можно иметь по одной таблице на тип.