vitek
@vitek
Программист, сисадмин, вот это всё

Логика и структура БД для работы с балансом и транзакциями

У меня планируется приложение, в котором у пользователей будет понятие баланса. Также будут транзакции, которые этот баланс изменяют в одну или другую сторону — зачисления и списания. Некоторые списания будут реализованы по схеме, когда пользователь запрашивает его, а некий модератор спустя время подтверждает. Или не подтверждает :)
Вопроса, собственно, два. Нужно ли хранить входящий/исходящий баланс в истории транзакций? Это очень пригодится для построения отчётов, чтобы можно было в случае чего найти нестыковки.
С другой стороны, как быть с неподтверждёнными транзакциями. Либо не считать их таковыми до подтверждения вообще и хранить в отдельной таблице запросов (но, блин, зачем плодить разные таблицы, если это можно хранить в одной?). Получается, что пока списание не подтверждено, входящий и исходящий баланс одинаковы. И потом после подтверждения нужно пробегать по всем последующим (если таковые успели появиться) и обновлять у них соответствующие поля, что выглядит мне противоречащим здравому смыслу.
В общем, буду рад идеям :)
  • Вопрос задан
  • 6307 просмотров
Решения вопроса 1
@1x1
Некоторые списания будут реализованы по схеме, когда пользователь запрашивает его, а некий модератор спустя время подтверждает.
Т.е. сначала просто блокировка средств на счету. Добавьте это поле и всё будет просто.

Нужно ли хранить входящий/исходящий баланс в истории транзакций?
Это удобно, но и без них многие работают.

С другой стороны, как быть с неподтверждёнными транзакциями.
Если вы позволяете использовать средства до подтверждения, то зачислять как обычно, а в случае неподтверждения добавлять отменяющую транзакцию. Если нет — транзакция происходит только в момент подтверждения платежа; платеж и транзакция по изменению баланса — разные сущности.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
sonic
@sonic
Баланс храни в отдельной таблице.
Ответ написан
sonic
@sonic
Вид документа потвержденный непотвержденный. Дата время изменения.
Ответ написан
Melorian
@Melorian
PHP, JAVA-разработчик
Недавно делал похожую систему.
Баланс пользователя хранится отдельно, там фиксируется актуальное «реальное» число условных единиц.
Есть таблица транзакций, с описанием, датой, суммой, направлением списания (на баланс или с баланса), поле «заморозка» и поле «статус».

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

В принципе, вполне хватает для всех нужд. Как только транзакция проводится, ее статус меняется на «исполнена», и деньги вычитаются уже из таблички пользователей.
Ответ написан
vitek
@vitek Автор вопроса
Программист, сисадмин, вот это всё
Баланс отдельно — имеется в виду отдельное поле в таблице с пользователями?

Для отображения на клиенте всякий раз строится сумма по транзакциям и в этот момент актуализируется то отдельное число? Я, кажется, не всё понял :)
Ответ написан
Комментировать
Illivion
@Illivion
Я считаю (и делаю :) ), что непотвержденные транзакции суть есть совсем не транзакции, а сущности запросов. Таким образом имеем 2 таблицы. Одну с запросами, где держим данные типа «кто, сколько, когда создал, когда отменил или подтвердил», а вторую уже с записями — фактическими движениями средств. Если заявка подтверждается модератором — создается запись в транзакциях.

Хранить входящий и исходящий балансы правильно в том случае, если вам потребуются отчеты, где будет выборка по периодам дат, и где нужно будет показать «входящий остаток» на начало этого периода. Вот тут-то оно очень сильно пригодится. Ибо считать его по транзакциям больно накладно получается (особенно, если их много очень)
Ответ написан
Ваш ответ на вопрос

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

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