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

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.
В случае, если свободных карточек (для продажи) осталось мало - отсылается уведемление админу.

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

Как ПРАВИЛЬНО решить поставленную задачу?
Буду признателен любому дельному совету.
 

chisto_tolyan

Враг народа
наверное, перед тем как создавать заказ нужно проверить еслть ли столько, сколько хочет юзер, карточек, иначе сказать "пардон, но у нас так много нету."
И лучше сами карточик держать не в файлах в папке, а в БД.
 

Panchous

Павел
наверное, перед тем как создавать заказ нужно проверить еслть ли столько, сколько хочет юзер, карточек, иначе сказать "пардон, но у нас так много нету."
о том и речь! Вопрос, как это правильно организовать.
т.е. если юзер выбрал 5 карточек (но не оплатил) и они имеются в наличии - сразу помечать их несвободными?
 

nalevo

Новичок
это отложенный заказ получается чтоли? То есть заказал он сейчас, а оплатит (может быть) через неделю?
 

Panchous

Павел
нет - он оплачиват заказ сразу...
только надо решить проблему с возможным отсутствием товара
(2 юзера одновременно оплачивают заказы по 5 карт - а из всего 7)
 

chisto_tolyan

Враг народа
юзер клацнул кнопу "купить 10" штук, если есть 10 штук - помечать их как "заказаные", т.е. не свободные. Карточки хранить в БД и проблем не возникнет, что юзеры одновременно нажмут)
 

nalevo

Новичок
Использовать транзакции.
1) стартуем транзакцию
2) убираем 5 карточек
3) снимаем деньги
4) закрываем транзакцию

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

Ну или можно таблицу SQL блокировать на время. Тут уж который скрипт заблокировал - тот и выполнится.
 

Steamroller

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

-~{}~ 28.10.05 19:29:

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