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

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

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

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

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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы