复式记账架构设计

c44*_*548 5 database-design

我们正在实施一个软件,允许在内部用户之间发送“虚拟”资金。我们已经使用如下单个条目启动了我们的数据库(简化表)。我们只记录一笔交易,其中用户发起的交易(汇款)都会被记录下来。所以它永远是一个借方。

TransactionLog
------------------
TransactionLogID
UserIDFrom
UserIDTo
CurrencyID
CurrencyAmount 
Remarks
TransactionDateTime
Run Code Online (Sandbox Code Playgroud)

然后需求发生变化,说明我们需要在我们的数据库中使用复式记账模式。然后我做了一个新表如下。

TransactionLogDoubleEntry
----------------------------
TransactionLogDoubleEntryID
TransactionLogID
UserID
CounterPartyUserID
CreditOrDebit
CurrencyID
CurrencyAmount
Remarks
TransactionDateTime
Run Code Online (Sandbox Code Playgroud)

我的问题:
1)我是否 以正确的方向执行此操作,即我添加TransactionLogDoubleEntry带有贷记/借记的表,这意味着它已经成为复式记帐模式?

2)我应该留在桌子上TransactionLog吗?或者使用TransactionLogDoubleEntry就足够了?

3)如果我要留在TransactionLog桌子上,我是否有必要复制currencyID, currencyAmount, remarks, TransactionDateTimein TransactionLogDoubleEntry?或者这足以从TransactionLog表中获取相应的值。

Phi*_*lᵀᴹ 6

大多数复式记账系统会使用 2 个表来实现这一点。一个表是“标题”表,存储公共字段和第二个“行”表,存储交易的实际细节。

如果您不知道,在复式会计中,给定交易中所有交易行的总和总是为零。

无论如何,根据您当前的设计,我会按照以下方式做一些事情:

Transaction
------------------
TransactionID
CurrencyID
Remarks
TransactionDateTime


TransactionLines
----------------
TransactionID
LineNo
UserID
DebitAmount
CreditAmount
Run Code Online (Sandbox Code Playgroud)

要将 $5.00 从 UserID 100 转移到 UserID 250,您需要输入以下条目:

Transaction: 

10000, 'USD', 'Test transaction', '2019/09/15 12:34:56'

TransactionLines: 

10000, 1, 100, 500, 0
10000, 2, 250, 0, 500
Run Code Online (Sandbox Code Playgroud)

您询问了可能存在多个交易行的情况:- 要从 UserID 100 转账 9.00 美元,其中 8.50 美元转到 UserID 123,0.50 美元转到 UserID 456,您需要输入以下条目:

Transaction: 

10001, 'USD', 'Test transaction', '2019/09/15 12:34:56'

TransactionLines: 

10001, 1, 100,   900,   0
10001, 2, 123,   0,     850
10001, 3, 456,   0,     50
Run Code Online (Sandbox Code Playgroud)

从数学/会计的角度来看,线条的顺序无关紧要,只要总数始终为净 0。

正确的会计系统将在每一行中都有一个总帐科目列,这将指示交易过帐到哪里,以及过帐期间和标题级别的其他基本信息。

如果您正在开发的系统处理的是真钱,我会认真考虑学习一些会计基础知识。

这显然是一个很高的水平。如果您需要进一步的帮助,请直接询问。