Estou criando um software de contabilidade. Preciso fazer valer a escrituração de partidas dobradas. Eu tenho o problema clássico de uma linha por transação versus duas linhas.
Vamos dar um exemplo e ver como ele seria implementado em ambos os cenários.
Considere conta Cash
e conta Rent
. Quando pago meu aluguel mensal, transfiro $ 100 da minha Cash
conta para minha Rent
conta.
Uma linha por transação
Em um sistema de uma linha, essa transação seria armazenada como:
transações
tx_id | posting_date
1 | 23/05/2015
registros_transação
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
Duas linhas por transação
Em um sistema de duas linhas, eu teria que espelhar o mesmo registro de transação para criar um registro oposto que, uma vez que eu somasse ambos, obteria saldo zero.
transações
tx_id | posting_date
1 | 23/05/2015
registros_transação
id | tx_id | type | account | amount
1 | 1 | credit | Cash | 100.00
2 | 1 | debit | Rent | 100.00
O problema
Antes de tudo, gostaria de observar: a razão pela qual tenho ambas as tabelas transactions
e transaction_records
(em vez de uma tabela) é poder lidar com transações divididas (um caso em que transfiro $ 100 de uma Cash
conta para duas ou mais contas diferentes).
No começo, tentei implementar isso com uma linha por transação, mas é difícil calcular o saldo da conta e realmente recuperar os dados.
Estou inclinado para o segundo cenário; no entanto, também tem alguns problemas:
- Como atualizo um único registro? Supondo que cometi um erro e, em vez de registrar $ 100 para meu aluguel, registrei $ 10. Agora tenho 2
transaction_records
- um para crédito e outro para débito, ambos com valor de $ 10. - Agora faço minha reconciliação e quero corrigir esse erro de digitação. Como eu corrigiria isso no banco de dados? Não conheço a conexão entre os registros, e em caso de divisão, uma transação pode ter mais de 2 registros. A única solução que encontrei é adicionar alguns
ref_id
para cada par de registros que identificará exclusivamente esses registros como sendo os "lados opostos um do outro" dentro de um contexto de um arquivotx_id
.
Qual abordagem é melhor/mais simples?
Para simplificar minha pergunta: quero representar um movimento de fundos da conta A para a conta B. Os dois cenários que dei são designs válidos para armazenar essa transação. Como também apontei, ambos têm contras e prós (primeiro: mais fácil de salvar, mais difícil de recuperar; segundo, o oposto).
Eles podem ter outros prós/contras que eu não identifiquei agora, por isso peço a opinião de pessoas mais experientes.