Estoy creando software de contabilidad. Necesito hacer cumplir la contabilidad de doble entrada. Tengo el problema clásico de una fila por transacción versus dos filas.
Tomemos un ejemplo y veamos cómo se implementaría en ambos escenarios.
Considere cuenta Cash
y cuenta Rent
. Cuando pago mi renta mensual, transfiero $ 100 de mi Cash
cuenta a mi Rent
cuenta.
Una fila por transacción
En un sistema de una fila, dicha transacción se almacenaría como:
actas
tx_id | posting_date
1 | 23/05/2015
transacción_records
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
Dos filas por transacción
En un sistema de dos filas, tendría que reflejar el mismo registro de transacción para crear un registro opuesto que una vez que sume ambos, obtendría un saldo cero.
actas
tx_id | posting_date
1 | 23/05/2015
transacción_records
id | tx_id | type | account | amount
1 | 1 | credit | Cash | 100.00
2 | 1 | debit | Rent | 100.00
El problema
En primer lugar, me gustaría señalar: la razón por la que tengo ambas transactions
y transaction_records
tablas (en lugar de una tabla) es para poder manejar transacciones divididas (un caso en el que transfiero $ 100 de la Cash
cuenta a dos o más cuentas diferentes).
Al principio traté de implementar esto con una fila por transacción, pero es difícil calcular el saldo de la cuenta y recuperar los datos.
Me estoy inclinando hacia el segundo escenario; Sin embargo, también tiene algunos problemas:
- ¿Cómo actualizo un solo registro? Asumiendo que he cometido un error y en lugar de registrar $ 100 por mi renta, he registrado $ 10. Ahora tengo 2
transaction_records
: uno para crédito y otro para débito, ambos con un monto de $ 10. - Ahora hago mi reconciliación y quiero arreglar este error tipográfico. ¿Cómo solucionaría esto en la base de datos? No sé la conexión entre los registros, y en caso de división, una transacción puede tener más de 2 registros. La única solución que se me ocurrió es agregar algunos
ref_id
para cada par de registros que identifiquen de forma única esos registros como los "lados opuestos entre sí" dentro de un contexto específicotx_id
.
¿Qué enfoque es mejor / más simple?
Para simplificar mi pregunta: quiero representar un movimiento de fondos de la cuenta A a la cuenta B. Los dos escenarios que di son ambos diseños válidos para almacenar dicha transacción. Como también señalé, ambos tienen inconvenientes y ventajas (el primero: más fácil de guardar, más difícil de recuperar; el segundo es lo contrario).
Es posible que tengan otros pros / contras que no veo en este momento, por lo tanto, pido una opinión de personas más experimentadas.