Алгоритм корзины товаров
Стоит задача - реализовать корзину и оформление заказов в инет-магазине. Существует множество товаров. Эти товары уникальны, т.е. каждый товар можно купить только один раз, после чего он пропадает из ассортимента.
Я реализовал корзину на сессиях (без использования СУБД). В связи с этим получилось так, что каждый пользователь может добавить один и тот же товар в корзину (одновременно). Если один из пользователей вдруг купит этот товар, то, по идее, он должен пропасть у других пользователей из их корзин.
Собственно, вопрос у меня больше архитектурный: правелен ли такой подход к реализации системы покупок?
Например рассмотрим другую ситуацию: допустим корзина реализована через БД и показ ассортимента будет производиться с учетом таблицы БД корзины. Соответственно, те товары, которые у кого-то в корзине, не будут показаны. Но вот, что делать, когда при таком подходе какой-нибудь шалопай вдруг добавит все товары в корзину? Ведь другие пользователи не увидят вообще ничего! Хотя бы на то время, пока не запустился скрипт очистки корзин (через планировщик).
Вообщем подскажите пожалуйста, как будет правильнее реализовать систему покупок. Может быть уже кто-то сталкивался с такой задачей.
Заранее спасибо.
Тогда достаточно два поля: int - сколько положили в корзину; и bool - товар удален.
Товар в корзину пусть может добавить любой человек, но купить только один. Тогда если человек повторно добавляет в корзину - то можно вывести оповещение, что товар хочет купить и другой человек, т.е. ему надо бы поторопиться. При этом при добавлении в корзину увеличиваем число, при удалении - убавляем.
Принцип "кто первый встал, того и тапки" конечно подходит для решения этой задачи, но если провести параллель с реальным магазином, то, если покупатель, допустим, навалил в корзину много товаров, подошел к кассе и вдруг передумал их покупать, то они ведь снова появятся на прилавке только через определенное время (когда персонал заново выложит их на полки). Но с другой стороны хотелось бы и банальную "защиту от дурака", т.к. в реальной жизни напихать все товары магазина в корзину сложнее, чем пара кликов в интернет-магазине.
Короче вопрос у меня такой: есть ли смысл делать вывод ассортимента с учетом информации о добавленных в корзины товарах?
Вообще не планируется, что пользователь будет очень долго выбирать товар, т.е. "подобрал по параметрам -> купил", т.е. фактически нет необходимости хранить корзину в БД.
Так что я вот никак не решу, оставить ли так, как уже реализовано, либо заморочиться и сделать "по аналогии с реальной жизнью". Может кто что посоветует?
Цитата: polaroid
Вообще не планируется, что пользователь будет очень долго выбирать товар, т.е. "подобрал по параметрам -> купил", т.е. фактически нет необходимости хранить корзину в БД.
Если пользователь что-то долго и вдумчиво выбрал по параметрам, а потом не купил, будет весьма полезно сохранить выбор в "Отложенном", как в "Озоне".
Цитата: polaroid
Эти товары уникальны, т.е. каждый товар можно купить только один раз, после чего он пропадает из ассортимента.
Вот тут вы сами себе противоречите. После этой фразы создалось впечатление, что вы картинами или антиквариатом каким торгуете. Да, купить 10 штук одинаковых картин нельзя, согласен. Но как это вяжется с подбором по параметрам?
После нажатия кнопки "Заказать" проводится сверка в БД по товарам в корзине, и если кто-то раньше нажал кнопку "Купить", то пользователю выдаётся сообщение "Извините, выбранный вами товар уже куплен" и возвращает его в корзину, где купленный товар становится "серым", "неактивным".
Такой принцип позволит вести актуальную базу.
Это всё равно что вы приходите в магазин купить кроссовки, которые подобрали вчера.... Приходите - а их уже купили... Что поделать, бывает.
Такой подход будет достаточно лояльным к покупателям.
Также предусмотреть для менеджера кнопку отмены заказа одним кликом и возврата товара на витрину.