我正在创建会计软件。我需要强制两次记账。我有一个经典的问题,即每笔交易要排两行。
让我们举个例子,看看在两种情况下如何实现它。
考虑帐户Cash
和帐户Rent
。当我支付月租金时,我将$ 100从我的Cash
帐户转入我的Rent
帐户。
每笔交易一行
在单行系统中,此类交易将存储为:
交易
tx_id | posting_date
1 | 23/05/2015
transaction_records
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
每笔交易两行
在两行系统中,我必须镜像相同的事务记录以创建相反的记录,一旦我将两者都加起来,就会得到零余额。
交易
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
问题
首先,我想指出:我同时拥有transactions
和transaction_records
表(而不是一个表)的原因是能够处理拆分交易(这种情况下,我将100美元从一个Cash
帐户转移到两个或多个不同的帐户)。
最初,我尝试用每笔交易一行来实现这一点,但是要计算帐户余额并实际检索数据很麻烦。
我倾向于第二种情况;但是,它也存在一些问题:
- 如何更新单个记录?假设我犯了一个错误,我没有记录$ 100的房租,而是记录了$ 10。我现在有2个
transaction_records
-贷方1个,借方1个,金额均为$ 10。 - 现在,我进行对帐,并且想解决此错字。如何在数据库中解决此问题?我不知道记录之间的联系,如果发生拆分,则一个事务可以包含两个以上的记录。我想出的唯一解决方案是
ref_id
为每个记录对添加一些,以将这些记录唯一地标识为特定上下文内的“彼此相对”tx_id
。
哪种方法更好/更简单?
为了简化我的问题:我想代表资金从帐户A到帐户B的转移。我给出的两种情况都是存储此类交易的有效设计。正如我也指出的那样,它们都有优点和缺点(第一个优点:更易于保存,更难检索;第二个优点相反)。
他们可能还有其他优点/缺点,但我暂时没有发现,因此,我想请经验丰富的人发表意见。