Задать вопрос

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

Прошу не судить строго, я только учусь, возможно будут ошибки в формулировке вопроса, но суть я постараюсь донести.
Пытаюсь создать интернет-магазин и тут столкнулся с такой проблемой.
Имеется один товар(например футболка) в БД с разными размерами (например S, M, XL).
1) Как правильно разработать структуры БД для этого товара, чтобы в дальнейшем было легче выводить товар на страницу и пользователь мог манипулировать с размерами, т.е выбирать любой размер данного товара:
- сначала я сделал так: 3829d3a9e7d546eabd3a4c9181c1085f.jpg
- затем вот так: 023a752ffb154d1abce945a3fdb03433.jpg
но что-то не очень мне эти варианты нравятся. Как на самом деле делают многие интернет-магазины данную структуру, чтобы в дальнейшем всё правильно выводилось? Либо подскажите кто знает как будет правильней.
2) Как правильно выводить товар на страницу? Например как тут(фото):(ссылка: www.ozon.ru/context/detail/id/31921559/?item=31920956)
e24f0e69e0044f01b1fa3059da166447.jpg
У меня при выборе размера и добавления в корзину попадает один размер, но когда я хочу добавить этот же товар только другого размера, то последний товар просто заменяет предыдущий, а мне нужно чтоб было два одинаковых товара в корзине, но с разными размерами.
P.S. Извиняюсь если неграмотно изложил суть проблемы, но кто понял помогите пожалуйста. Или хотя бы подскажите куда двигаться, дальше уже я сам. Спасибо.
  • Вопрос задан
  • 7794 просмотра
Подписаться 8 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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 и т.д.) и связать с основной.
Выборка из БД через джоин, допустим. Можно сделать так, чтобы при клике в корзину заносился заказ и в таблице с размерами убавлялось кол-во соответственно выбранного размера. Это на вскидку, детальнее, думаю уже сами доделаете. Удачи!
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽