Ich erstelle Buchhaltungssoftware. Ich muss die doppelte Buchführung erzwingen. Ich habe das klassische Problem einer Zeile pro Transaktion gegenüber zwei Zeilen.
Nehmen wir ein Beispiel und sehen, wie es in beiden Szenarien implementiert wird.
Betrachten Sie Konto Cash
und Konto Rent
. Wenn ich meine monatliche Miete bezahle, überweise ich 100 USD von meinem Cash
Konto auf mein Rent
Konto.
Eine Zeile pro Transaktion
In einem einzeiligen System würde eine solche Transaktion gespeichert werden als:
Transaktionen
tx_id | posting_date
1 | 23/05/2015
transaction_records
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
Zwei Zeilen pro Transaktion
In einem zweizeiligen System müsste derselbe Transaktionsdatensatz gespiegelt werden, um einen entgegengesetzten Datensatz zu erstellen. Wenn ich beide zusammenfasse, erhalte ich einen Saldo von Null.
Transaktionen
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
Das Problem
Zunächst möchte ich festhalten: Der Grund, warum ich sowohl Tabellen transactions
als auch transaction_records
Tabellen (anstelle einer Tabelle) habe, ist die Möglichkeit, geteilte Transaktionen durchzuführen (ein Fall, bei dem ich 100 USD von einem Cash
Konto auf zwei oder mehr verschiedene Konten überweise).
Zuerst habe ich versucht, dies mit einer Zeile pro Transaktion zu implementieren, aber es ist schwierig, den Kontostand zu berechnen und die Daten tatsächlich abzurufen.
Ich neige zum zweiten Szenario. Es gibt jedoch auch einige Probleme:
- Wie aktualisiere ich einen einzelnen Datensatz? Angenommen, ich habe einen Fehler gemacht und statt 100 USD für meine Miete zu verbuchen, habe ich 10 USD verbucht. Ich habe jetzt 2
transaction_records
- eine für Kredit und eine für Lastschrift, beide mit einem Betrag von 10 $. - Jetzt mache ich meine Versöhnung und ich möchte diesen Tippfehler beheben. Wie würde ich das in der Datenbank beheben? Ich kenne den Zusammenhang zwischen Datensätzen nicht und im Falle eines Split kann eine Transaktion mehr als 2 Datensätze enthalten. Die einzige Lösung, die ich gefunden habe, besteht darin,
ref_id
für jedes Datensatzpaar einige Datensätze hinzuzufügen , die diese Datensätze eindeutig als "gegenüberliegende Seiten" innerhalb eines bestimmten Kontexts identifizierentx_id
.
Welcher Ansatz ist besser / einfacher?
Um meine Frage zu vereinfachen: Ich möchte eine Bewegung von Geldern von Konto A zu Konto B darstellen. Die beiden Szenarien, die ich angegeben habe, sind beide gültige Entwürfe zum Speichern einer solchen Transaktion. Wie ich auch betonte, haben beide Nachteile und Vorteile (erstes: leichter zu speichern, schwerer zu finden, zweites das Gegenteil).
Möglicherweise haben sie andere Vor- und Nachteile, die ich derzeit nicht sehe. Daher frage ich erfahrene Leute nach einer Meinung.