Организация магазина: нужна критика и конструктивные предложения.

Panchous

Павел
Организация магазина: нужна критика и конструктивные предложения.

Система продает через инет карточки оплаты.

После того, как клиент оплатил заказ, он должен иметь возможность скачать себе файл с кодом активации.
(для него хранятся все заказы)

- на сервере имеется папка с файлами (карточками), которая периодически пополняется новыми поступлениями

как лучше организовать работу магазина (алгоритм и БД) в такой ситуации?

Возможные проблемы:
- отсутствие карточек на сервере
(как быть, если два юзера делают одновременно заказы на 10 карт, а доступно всего 11?)

Раньше ничего подобного не делал - нужен Ваш совет.
Сам додумался до следующего...

БД (упрощенно):

user (user_id=PK, login, password)
order (order_id=PK, user_id=FK, oplachen={0,1}, vipolnen={0,1})
card (card_id=PK, filename, free={0,1})
order2card (order_id=FK, card_id=FK)

после того, как юзер сформировал заказ (>=1 карточки)
и оплатил его, заказ помечается как ОПЛАЧЕННЫЙ (oplachen=1),
но не выполненный (vipolnen=0)
далее, скрипт (запускается по крону) проверяет оплаченные и невыполненные заказы, и (если есть необходимое кол-во свободных карточек) помечает карточки флагом free=0, а заказ флагом vipolnen=1.
В случае, если свободных карточек (для продажи) осталось мало - отсылается уведемление админу.

Впрочем, я уже запутался совсем(

Как ПРАВИЛЬНО решить поставленную задачу?
Буду признателен любому дельному совету.
 
наверное, перед тем как создавать заказ нужно проверить еслть ли столько, сколько хочет юзер, карточек, иначе сказать "пардон, но у нас так много нету."
И лучше сами карточик держать не в файлах в папке, а в БД.
 
наверное, перед тем как создавать заказ нужно проверить еслть ли столько, сколько хочет юзер, карточек, иначе сказать "пардон, но у нас так много нету."
о том и речь! Вопрос, как это правильно организовать.
т.е. если юзер выбрал 5 карточек (но не оплатил) и они имеются в наличии - сразу помечать их несвободными?
 
это отложенный заказ получается чтоли? То есть заказал он сейчас, а оплатит (может быть) через неделю?
 
нет - он оплачиват заказ сразу...
только надо решить проблему с возможным отсутствием товара
(2 юзера одновременно оплачивают заказы по 5 карт - а из всего 7)
 
юзер клацнул кнопу "купить 10" штук, если есть 10 штук - помечать их как "заказаные", т.е. не свободные. Карточки хранить в БД и проблем не возникнет, что юзеры одновременно нажмут)
 
Использовать транзакции.
1) стартуем транзакцию
2) убираем 5 карточек
3) снимаем деньги
4) закрываем транзакцию

запросы все-равно выполняются поочереди, так, что если первому засчитались 5 карточек, то у второго в этом месте будет ошибка, а значит оставшиеся 2 карточки так и останутся и деньги не снимутся. а мы сможем вывести - "извините осталось только 2".

Ну или можно таблицу SQL блокировать на время. Тут уж который скрипт заблокировал - тот и выполнится.
 
Использовать транзакции.
1) стартуем транзакцию
2) убираем 5 карточек
3) снимаем деньги
4) закрываем транзакцию
Это круто конечно, только операция №3 - внешняя по отношению к системе, и например если оказалось что карточек нету - то вернуть деньги не всегда можно.

-~{}~ 28.10.05 19:29:

Хотя да, можно транзакциям поставить уровень serializable и вперед, само все разрулится. :)
 
Сверху