UPD: Что-то я упустил, пошел думать...
3 нормальная форма, классика жанра
И сделать денормализацию
products [id, name, ....]
variants [id, product_id, type, require, price (?)]
product_characteristics [id, name,sort,...]
product_values [product_characteristics_id, product_id, value]
variant_characteristics[id, name, sort,...]
variant_values [variant_characteristics_id, variant_id, value]
Описание:
Есть товар, у него есть варианты в таблице
variants
Так как у вариантов не известно сколько будет полей (а скорее всего очень много), то выносим эти поля в таблицу
variant_characteristics с связующей таблцей
variant_values , то есть это связь многие ко многим.
Например: есть варианты с выбором размера и длины, то в таблице variant_characteristics заводим эти значения, а в таблице variant_values указываем id этих значений, id варианта и само значение* Важно:
если на цену не влияют характеристики, то цену прямо варианту задаем в
variants, если влияют (например XL стоит дороже XS), то писать ее в
variant_values
Это называется EAV
https://en.wikipedia.org/wiki/Entity%E2%80%93attri...
Характеристики товара тоже будут также сделаны, но там будет уже не вариант товара, а сам товар.
Картинки также делаются.