Здравствуйте. Я приведу какие способы реализаций придумал/подсмотрел я. Возможно есть гораздо лучшие решения.
Различные варианты товаров в интернет магазине могут выводится такими способами
—
rozetka.com.ua/acer_liquid_mt_s120_silver/p144068/ — странички практически отличаются. У каждого своя цена, свои изображения (название, могут быть и свои акции и т.д.)
—
shop.dinternal.com.ua/textbook/excellent/ — товара как такового нет. Он просто комплект других товаров (хотя своя цена тоже может быть. К примеру за все товары вместе.) Еще особенность это разделение вариантов по группам. В более простом варианте очень часто используется в каталогах машинных деталей.
Других вариантов отображения товаров я не встречал.
Теперь поговорим про решения.
1. Товары полностью отличаются и связываются много к многому через смежную таблицу
Преимущества
— можно реализовать что угодно
Недостатки
— дублируется очень много информации
— сложно реализовать информацию которая относится ко всем товарам (общие комментарии, оценка товара пользователями и т.д.)
— если описание товара изменилось нужно менять его во всех его вариациях.
2. Некое наследование. Есть главный товар. Другие товары наследуемые.
По умолчанию у них не заполнено ни одно поле кроме id товара от которого происходит наследование. Когда мы выводим товар и у него есть поле id родителя + выводимое поле пустое берется значение главного товара.
Преимущества
— комментарии, оценку пользователей можно ставить на товар родитель.
— заполняется информация различная для товаров. Одновременно с этим мы не теряем в гибкости
Недостатки
— У товара может быть 30 разных полей. Выходит у товара-вариации они все будут пустыми. База данных будет магко говоря корявой
— В ORM получение полей родителя не должно отличатся от обычного получения полей товара (для прозрачной работы). С другой стороны при редактировании объект должен вести себя совершенно по другому выдавая настоящие значения полей.
— В базе данных некоторые поля могут быть обязательными для заполнения. Хотя по текущей логике работы системы они должны быть пустыми.
3. Вынести цену товара отдельно от товара и добавить к ней поле название вариации. Этот способ встречался мной чаще всего. И он в большинстве случаев лучший.
Преимущества
— Не хранится лишней информации. И база данных заполняется без пробелов.
— Реализует большинство задач
Недостатки
— Требует значительной модификации кода если вдруг потребуется сделать вывод как в розетке. И вообще для такого способа группировки товаров он слабо подходит
— Значительно усложняется работа с ценами товара.
— Практически исключается поиск конкретной модификации товара и также вывод нескольких модификаций в каталоге как разных товаров.
Буду рад любым замечаниям и советам. Цель создать такую структуру базы данных что бы с минимальными телодвижениями можно было реализовать максимальное количество способов отображения товаров.