数据库设计 – 双入簿记数据库设计

我正在创建会计软件.我需要强制执行复式记账.我有每行事务一行而不是两行的经典问题.

让我们举一个例子,看看它将如何在两种情况下实现.

考虑账户现金和账户租金.当我支付每月租金时,我将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,“完全标准化”似乎意味着所有会计师都认可的规则,而对于程序员而言,它具有不同的含义,即没有存储的派生或冗余数据.

所有会计数据都是一组交易,它们提供金额以及它们流动的帐户以及它们的日期,一些描述(以及其他附件).分类帐和余额是通过执行总和从此事务数据派生的简单视图.

转载注明原文:数据库设计 – 双入簿记数据库设计 - 代码日志