让我们举一个例子,看看它将如何在两种情况下实现.
考虑账户现金和账户租金.当我支付每月租金时,我将100美元从我的现金账户转到我的租金账户.
每个交易一行
在单行系统中,此类事务将存储为:
交易
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
问题
首先,我要注意:我有交易和transaction_records表(而不是一个表)的原因是能够处理拆分交易(我从现金账户转移100美元到两个或更多不同账户的情况) .
起初我尝试使用每个事务一行来实现它,但是计算帐户余额并实际检索数据很痛苦.
我倾向于第二种情况;但是,它也有一些问题:
>如何更新单个记录?假设我犯了一个错误,而不是记录100美元的租金,我记录了10美元.我现在有2个transaction_records – 一个用于信用卡,一个用于借记卡,两个金额均为10美元.
>现在我进行和解,我想解决这个错误.我如何在数据库中解决这个问题?我不知道记录之间的连接,如果是拆分,一个事务可以有两个以上的记录.我想出的唯一解决方案是为每个记录对添加一些ref_id,这些记录对将唯一地将这些记录标识为特定tx_id的上下文中的“彼此的相对侧”.
哪种方法更好/更简单?
为了简化我的问题:我想表示从帐户A到帐户B的资金流动.我给出的两个方案都是存储此类交易的有效设计.我也指出他们都有缺点和优点.专业人士(第一个:更容易保存,更难以检索;第二个相反).
他们可能有其他我现在没有发现的优点/缺点,因此我向更有经验的人提出意见.
解决方法
一行模式为您提供了一个双重条目的实现,它通过构造进行平衡,因此不可能“松散平衡”.机器可以在运行中重新计算分类帐.
您必须执行2次选择而不是一次来检索分类帐.
注意,除了事务拆分之外,还有其他交易,例如外汇可能最终会有2条记录而不是4条.这取决于你是否会对一些进行非规范化,只需输入具有类似描述的4条交易.
您可以阻止输入或修改任何事务以维护审计跟踪,如果您希望能够审计事务日志,则这是必需的.
看来,在上面的主题中,对于CPA,“完全标准化”似乎意味着所有会计师都认可的规则,而对于程序员而言,它具有不同的含义,即没有存储的派生或冗余数据.
所有会计数据都是一组交易,它们提供金额以及它们流动的帐户以及它们的日期,一些描述(以及其他附件).分类帐和余额是通过执行总和从此事务数据派生的简单视图.