Как правильно реализовать в БД и PHP размеры одежды для интернет-магазина?

Прошу не судить строго, я только учусь, возможно будут ошибки в формулировке вопроса, но суть я постараюсь донести.
Пытаюсь создать интернет-магазин и тут столкнулся с такой проблемой.
Имеется один товар(например футболка) в БД с разными размерами (например S, M, XL).
1) Как правильно разработать структуры БД для этого товара, чтобы в дальнейшем было легче выводить товар на страницу и пользователь мог манипулировать с размерами, т.е выбирать любой размер данного товара:
- сначала я сделал так: 3829d3a9e7d546eabd3a4c9181c1085f.jpg
- затем вот так: 023a752ffb154d1abce945a3fdb03433.jpg
но что-то не очень мне эти варианты нравятся. Как на самом деле делают многие интернет-магазины данную структуру, чтобы в дальнейшем всё правильно выводилось? Либо подскажите кто знает как будет правильней.
2) Как правильно выводить товар на страницу? Например как тут(фото):(ссылка: www.ozon.ru/context/detail/id/31921559/?item=31920956)
e24f0e69e0044f01b1fa3059da166447.jpg
У меня при выборе размера и добавления в корзину попадает один размер, но когда я хочу добавить этот же товар только другого размера, то последний товар просто заменяет предыдущий, а мне нужно чтоб было два одинаковых товара в корзине, но с разными размерами.
P.S. Извиняюсь если неграмотно изложил суть проблемы, но кто понял помогите пожалуйста. Или хотя бы подскажите куда двигаться, дальше уже я сам. Спасибо.
  • Вопрос задан
  • 7726 просмотров
Пригласить эксперта
Ответы на вопрос 7
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Основная таблица товаров по артикулу
Таблица остатков по размерам (артикул, размер, остаток)
При добавлении в корзину количество суммируется по паре (артикул, остаток)
Ответ написан
@sarathorn
php программист, веб-дизайнер, коллекционер
Делал такое, геморроя много. Остановился на варианте с тремя таблицами.
таблица items:
id_товара | название | цена и тд...
таблица options:
id_опции | название опции | влияние на цену
таблица items-options:
id_товара | id_опций через запятую | название связки

Таким образом, грузим из items базовую информацию, грузим items-options, получаем от туда примерно такое:
1 | 1,2,3,4 | Цвет
Значит, что у товара 1 есть возможность выбора цвета...
Прогружаем options с айди 1,2,3 и 4. Получаем, например:
1 | Красный | 0
2 | Синий | +100
3 | Белый | -20
4 | Чёрный | 0
Значит, что товар с красным и чёрным цветом будет стоить базовую цену, синего цвета на 100 рублей дороже, а белого уже на 20 дешевле.

В корзину записывать всё в формате:
id_товара | id_выбранных_опций_через_запятую | количество

Если посетитель добавит некий товар 1 двух разных цветов, то в корзине будет две записи:
1 | 1,2 | 1
1 | 3,4 | 1
Опции можно комбинировать. В моём случае это были межкомнатные двери, нужно было учитывать размер полотна, цвет и наличие базовых аксессуаров (петли, ручка, наличники и прочее..). Соответственно, если посетителю нужна дверь 200х100см и такая же 190х90см, то разумнее это в корзине представить как два разных товара. Так он сможет совершенно спокойно заказать две двери первого размера и, допустим, семь дверей второго размера.

Понимаю, что в каком-то плане моя реализация костыльная, но зато она работает и работает очень просто.
Ответ написан
Комментировать
@serega_kaktus
Программист-самоучка, фрилансер
Вариантов много, все зависит от того, какие еще фичи завязаны на параметре "размер". Я видел в магазинах и как ваш первый вариант - но тогда нужно при добавлении товара в корзину сравнивать не только id товара, но и размер, чтобы не было замещения. Видел и ваш второй вариант - с одной стороны, он гибкий, можно добавить разные фичи, с другой стороны, немного переусложнен.
Еще можно создать таблицу размеров, и таблицу товар-размер, при этом на карту добавлять товар и запись из таблицы товар-размер, чтобы они были уникальными.
Ответ написан
Комментировать
HiNeX
@HiNeX
Web Developer
Можно сделать так: подпродукт это цвет, дополнительный аттрибут это размеры (можно сделать мультиселект в админке и писать в админку массив из выбранных размеров, например через serialize() в одно поле к подпродукту.
Ответ написан
Комментировать
@Remsin
По первому вопросу: в таком случае размеры стоит вынести в отдельное отношение и связать его с отношением "Одежда". Т.е. создаёте ещё одну таблицу - "sizes" (там будет храниться инфа о всех размерах) с атрибутами - id и названия размеров. А в существующей таблице "clothes" добавляете новый атрибут "sizes_id" и делаете его внешний ключом от таблицы "sizes".
Ответ написан
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Стандартный подход:
1 Таблица - товар и его стандартные характеристики
2 Таблица - дополнительные характеристики (цвета, размеры, габариты, наличие/остатки и прочее)
3 Таблица - связи между первыми 2мя таблицами
Выборка из этих таблиц с помощью LEFT JOIN / INNER JOIN, например.
Бывает еще промежуточная таблица "типы связей", тогда в таблице 2 хранятся только сами опции и внешний ключ на поле ID из таблицы "типы связей". То есть, Т1 - товары, Т2 - типы связей (цвет, размер, вес, наличие и тд), Т3 - характеристики (все варианты цветов, размеров и тд), Т4 - связи. Такие схемы встречаются, но, ИМХО, редко имеют смысл. Стандартной модели обычно достаточно.
Ответ написан
Комментировать
Sphinx123
@Sphinx123
Web-программист @Yii2
Совершенно согласен с Remsin. Сделать вторую таблицу с размером (id, sizes, count и т.д.) и связать с основной.
Выборка из БД через джоин, допустим. Можно сделать так, чтобы при клике в корзину заносился заказ и в таблице с размерами убавлялось кол-во соответственно выбранного размера. Это на вскидку, детальнее, думаю уже сами доделаете. Удачи!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы