Um problema antigo que nunca foi resolvido com elegância.
Todos os pacotes bancários com os quais trabalhei armazenam o saldo na entidade da conta. Calculá-lo em tempo real a partir do histórico de movimentos é impensável.
A forma correta é:
- A tabela de movimento tem uma transação 'openingbalance' para cada conta. Você precisará disso daqui a alguns anos quando precisar mover movimentos antigos da tabela de movimento ativa para uma tabela de histórico.
- A entidade da conta tem um campo de saldo
- Existe um gatilho na tabela de movimentação que atualiza os saldos das contas creditadas e debitadas. Obviamente, tem controle de compromisso. Se você não pode ter um acionador, então deve haver um exclusivo módulo que grava movimentos sob controle de confirmação
- Você tem um programa de 'rede de segurança' que pode ser executado offline, que recalcula todos os saldos e exibe (e, opcionalmente, corrige) os saldos incorretos. Isso é muito útil para testar.
Alguns sistemas armazenam todos os movimentos como números positivos e expressam o crédito/débito invertendo os campos de/para ou com um sinalizador. Pessoalmente, prefiro um campo de crédito, um campo de débito e um valor assinado, isso facilita muito o acompanhamento das reversões.
Observe que esses métodos se aplicam tanto a dinheiro quanto a títulos.
As transações de títulos podem ser muito mais complicadas, especialmente para ações corporativas, você precisará acomodar uma única transação que atualize um ou mais saldos de caixa de compradores e vendedores, seus saldos de posições de títulos e possivelmente o corretor/depositário.