Более традиционным подходом было бы использование большей части схемы учета с двойной записью.
Вы можете прочитать об этом проекте где угодно, но вот ссылка на довольно хорошее обсуждение того, что это такое и как оно работает.
В результате вы захотите, чтобы отдельная таблица связала две части вашей примерной транзакции в одну единицу работы. Вам нужна одна таблица с одной записью для каждой бизнес-транзакции, а другая таблица - одна запись для каждой учетной записи, участвующей в этой транзакции. В ссылочной ссылке это таблицы JOURNAL и POSTING.
В этом дизайне доступные кредиты не сохраняются в учетной записи, если вы не хотите сделать это как денормализацию. Обычно баланс всегда рассчитывается.
Вы можете решить использовать таблицу истории баланса счета для целей отчетности, но вам нужно будет обязательно обработать пересчет этой истории, если ваша система допускает редактирование старых транзакций (, чего не будет, если бы это была обычная система учета).
Если вы хотите провести различие между транзакциями, находящимися на рассмотрении, и транзакциями, которые были завершены, то вы можете установить флаг статуса для транзакции (в ссылочной ссылке, таблица JOURNAL). Тем не менее, существует также более разностороннее соглашение о бухгалтерском учете, которое дает каждому пользователю две учетные записи, одну из заработанных кредитов и одну незаработанную. В этой схеме, используя ваш пример, B и C положили бы некоторые кредиты на ожидающий кредитный счет A. Это сразу же приведет к привлечению средств на счетах B и C, чтобы они не тратили эти кредиты в другом месте. Когда А завершает работу, эти кредиты переводятся с ожидающего аккаунта А на текущий аккаунт А. Если задание будет отменено, вы должны внести транзакцию, чтобы перевести обратно с ожидающего аккаунта А на текущие счета Б и С.
Этот способ может показаться немного более сложным, но у него есть явное преимущество: всегда есть запись всего, что произошло.