私は会計ソフトウェアを作成しています。複式簿記を実施する必要があります。トランザクションごとに1行と2行の古典的な問題があります。
例を挙げて、両方のシナリオでどのように実装されるかを見てみましょう。
account Cash
とaccountを検討してくださいRent
。毎月の家賃を支払うと、Cash
アカウントから100ドルを口座に振り替えRent
ます。
トランザクションごとに1行
1行システムでは、このようなトランザクションは次のように保存されます。
取引
tx_id | posting_date
1 | 23/05/2015
transaction_records
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
トランザクションごとに2行
2行のシステムでは、同じトランザクションレコードをミラーリングして反対のレコードを作成し、両方を合計すると、残高がゼロになります。
取引
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
問題
まず最初に注意したいのは、(1つのテーブルの代わりに)テーブルtransactions
とtransaction_records
テーブルの両方を持っている理由は、分割トランザクションを処理できるようにするためです(Cash
アカウントから2つ以上の異なるアカウントに100ドルを転送する場合)。
最初は、トランザクションごとに1行でこれを実装しようとしましたが、アカウントの残高を計算し、実際にデータを取得するのは面倒です。
私は2番目のシナリオに傾いています。ただし、いくつかの問題もあります。
- 単一のレコードを更新するにはどうすればよいですか?間違いを犯し、家賃に100ドルを記録する代わりに、10ドルを記録したと仮定します。私は現在、2
transaction_records
つを持っています-1つはクレジット用、もう1つはデビット用で、どちらも金額が10ドルです。 - 今、私は和解を行い、このタイプミスを修正したいと思います。データベースでこれをどのように修正しますか?レコード間の接続がわかりません。また、分割の場合、1つのトランザクションに3つ以上のレコードが含まれることがあります。私が思いついた唯一の解決策
ref_id
は、特定ののコンテキスト内で「互いの反対側」であるとしてそれらのレコードを一意に識別する各レコードのペアにいくつかを追加することtx_id
です
どのアプローチがより良い/簡単ですか?
質問を簡単にするために、口座Aから口座Bへの資金の移動を表したいと思います。私が与えた2つのシナリオは両方とも、そのような取引を保存するための有効な設計です。私も指摘したように、両者には短所と長所があります(1つ目は保存が簡単で、取得が難しく、2つ目は反対です)。
彼らには、私が今のところ見つけていない他の長所/短所があるかもしれないので、より経験のある人から意見を聞きます。