Je crée un logiciel de comptabilité. Je dois appliquer la comptabilité à double entrée. J'ai le problème classique d'une ligne par transaction contre deux lignes.
Prenons un exemple et voyons comment il serait implémenté dans les deux scénarios.
Considérez compte Cash
et compte Rent
. Lorsque je paie mon loyer mensuel, je transfère 100 $ de mon Cash
compte vers mon Rent
compte.
Une ligne par transaction
Dans un système à une ligne, une telle transaction serait stockée sous la forme:
transactions
tx_id | posting_date
1 | 23/05/2015
transaction_records
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
Deux lignes par transaction
Dans un système à deux rangées, je devrais refléter le même enregistrement de transaction pour créer un enregistrement opposé qui, une fois que je résume les deux, j'obtiendrais un solde nul.
transactions
tx_id | posting_date
1 | 23/05/2015
transaction_records
id | tx_id | type | account | amount
1 | 1 | credit | Cash | 100.00
2 | 1 | debit | Rent | 100.00
Le problème
Tout d'abord, je voudrais noter: la raison pour laquelle j'ai les deux tables transactions
et transaction_records
(au lieu d'une table) est de pouvoir gérer des transactions fractionnées (un cas où je transfère 100 $ du Cash
compte vers deux ou plusieurs comptes différents).
Au début, j'ai essayé de l'implémenter avec une ligne par transaction, mais c'est difficile de calculer le solde du compte et de récupérer les données.
Je penche vers le deuxième scénario; cependant, il a également quelques problèmes:
- Comment mettre à jour un seul enregistrement? En supposant que j'ai fait une erreur et au lieu d'enregistrer 100 $ pour mon loyer, j'ai enregistré 10 $. J'en ai maintenant 2
transaction_records
- un pour le crédit et un pour le débit, les deux avec un montant de 10 $. - Maintenant, je fais ma réconciliation et je veux corriger cette faute de frappe. Comment pourrais-je résoudre ce problème dans la base de données? Je ne connais pas le lien entre les enregistrements, et en cas de scission, une transaction peut avoir plus de 2 enregistrements. La seule solution que j'ai trouvée consiste à en ajouter
ref_id
pour chaque paire d'enregistrements qui identifiera de façon unique ces enregistrements comme étant les "côtés opposés les uns des autres" dans un contexte spécifiquetx_id
.
Quelle approche est meilleure / plus simple?
Pour simplifier ma question: je veux représenter un mouvement de fonds du compte A vers le compte B. Les deux scénarios que j'ai donnés sont tous deux des modèles valides pour stocker une telle transaction. Comme je l'ai également souligné, ils ont tous les deux des inconvénients et des avantages (le premier: plus facile à enregistrer, plus difficile à récupérer; le second à l'opposé).
Ils pourraient avoir d'autres avantages / inconvénients que je ne repère pas en ce moment, c'est pourquoi je demande l'avis de personnes plus expérimentées.