MySQL双重记账系统数据库设计?

9
我将为MySQL创建一个双向记账系统的数据库。
我最近阅读了这篇文章:http://homepages.tcp.co.uk/~m-wigley/gc_wp_ded.html,发现在此文章中,有三个表ACCOUNT、JOURNAL和POSTING会很方便。
ACCOUNT(accountID, accountName)
JOURNAL(journalID, journalType)
POSTING(postingID, journalID, accountID, amount)

这篇文章描述了,如果一个账户被借记,'amount'字段的值将为正数,否则为负数。

现在对于上面的POSTING表,我还有另外两个选项...

(1) POSTING(postingID, journalID, accountID, isDr, amount)

在这个选项中,“isDr”字段是一个布尔值。如果账户被借记,则“isDr”字段将包含值“true”,否则为“false”。而“amount”字段始终具有正值。
(2) POSTING(postingID, journalID, accountID, debitAmount, creditAmount)

在这里,如果账户被借记,则将金额存储在“debitAmount”字段中,否则将其存储在“creditAmount”字段中。

那么,到底从上述三个选项中选择哪一个更好呢?


我学过一些会计课程,也了解SQL数据库设计,但我并不能完全理解你的问题。看起来你想在两个不同的“POSTING”表之间做出决定。实话实说,我以前没有在SQL中实现过会计表,但我会尽力帮助你。 - user677526
谢谢@lunchmeat317.. 是的,我想在三个不同的POSTING表之间做出决定(包括作者编写的那个)。 - user617447
1
@Jignesh,“我打算在MySQL中为双重记账系统创建一个数据库”。为什么这样做?你做的事情是其他1000个会计软件已经完成的,而且其中很多可以以比自己发明便宜得多的价格购买。 - nvogel
1
@dportas,感谢您的评论。但我既不是为客户做这个,也不是为我的大学项目做这个。软件开发是我的爱好,这个项目只是为了我的个人经验。 :) 所以最好不要购买已经创建好的会计软件包!! - user617447
2
选择一个更有趣的项目吧! - nvogel
日期会存储在哪个表格中?日志(Journal)中是否会有交易日期(事件发生的日期),并且在过账(Postings)时记录条目的日期(将条目录入数据库的日期)? - Craig
3个回答

3
这是主观的,但我认为选项#0(只有一个单独的amount字段为正或负)最好。选项#1会在您想要包括借记和贷记的数学计算时给您带来很多痛苦,因为您将不得不查看isDr字段以确定是否要乘以-1。选项#2未经过良好归一化,因为表达式debitAmount IS NULLcreditAmount IS NOT NULL将是等效的(如果它们有所不同,则您的数据库处于不一致状态)。

关于“借方”和“贷方”字段分开的观点很有道理。在T表中这并不是太容易出错(虽然有可能),但在SQL中却非常容易出错。基本上……我不确定SQL是否被设计用来促进GAP。 - user677526

2

选项#0存在一个缺点,我最近遇到了这个问题:

有些情况需要在账簿上将已记录的数额显示为负数(-),而不是在借方显示为正数(+)(反之亦然)。

如果未标记为借方或贷方,或者没有其他解决方法,选项#0将无法实现这一点。

如果需要记录任何负数金额并将其显示在贷方(反之亦然),您需要咨询会计师。


1

我建议选择选项#1。选项#2会导致许多未使用的字段(借方金额和贷方金额字段总量的50%)。此外,选项#1允许您轻松地推导出当前余额。

最后(或者也许是首先),选项#1遵循适当的规范化。


谢谢您的意见。对于选项#0,您有什么看法吗?POSTING(postingID,journalID,accountID,amount) - user617447
2
我错过了“选项#0”的含义。我同样喜欢那个选项。事实上,除非需要区分Dr和Cr金额,否则使用“选项#0”。我想符号和账户类型会告诉大多数人有关借方或贷方状态的信息。 - XIVSolutions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接