你做一个游戏网站,用户可以购买游戏积分,资金存入/存入用户的虚拟帐户,玩一些游戏等...等。
1
如果你让一个会计来记录交易,它会像这样记录(可能有点复杂,但你明白了重点)
TRANSACTION
PK_ID1 Cash - $10 (System)
PK_ID2 Deposit $10 (System)
TRANSACTION
PK_ID3 Bank Account - $10 (John)
PK_ID4 Deposit $10 (John)
2
作为一个开发人员,你真的需要浪费2个额外的记录吗?为什么不这样记录呢...(然后你可以在同一个存款记录下的其他列中存储资金来自哪里的信息,状态)
TRANSACTION
PK_ID1 Cash - $10 (system)
PK_ID2 Deposit $10 (John)
选项1比选项2和副签证有什么真实的的优势吗?
EDIT:修改问题,删除CR、DR并替换为符号。
2条答案
按热度按时间t98cgbkg1#
(回答了你的问题,但也回答了paxdiablo回答中提出的一些观点。)
这与会计人员查看你的数据库无关。使用复式记账,错误很容易被追踪;这是一个会计和国税局的要求,所以真的,你没有选择,你需要复式分录的任何系统,处理公共资金。
JohnAccount
收件人:SystemAccount
数量:(美元)SystemGamingAccount
收件人:JohnGamingAccount
数量:100
(学分)或以美元计:
SystemGamingAccount
收件人:JohnGamingAccount
数量:(美元)Warehouse
收件人:x1立方米10立方米1x数量:1
(小工具)UPDATE Part SET QtInStock = QtyInStock - 1 WHERE PartCode = "Widget"
),所有这些都封装在一个SQL事务中。每个用户都有一个账户,对吧。虚拟的,神秘的或物理的,它是一个法律的实体,对它进行交易。所以让我们不要假装它不存在,因为它是虚拟的。对于游戏,一美元的账户加上一个游戏(信用)账户。
贷方/借方
我会把CR/DB放回去;不是CHAR(2),而是布尔值。当表很大时,它会帮助您以后使用。
比
注意,使用“〉=”时,你必须确保每个代码段的编码方式相同,而不是有时使用“〉”。布尔型或字符型没有这个问题。
g52tjvyc2#
至于数据(这就是你要问的),不。你应该把它存储为一个有符号的值。复式簿记不是暴民做的事情,这样它就可以向国税局隐藏真实的的利润:-)
这意味着交易必须是平衡的(价值永远不会被创造或毁灭,只是被转换)。如果你只是把它们存储在一个有符号的列中,平衡交易(和账簿)会容易得多。
在视觉呈现方面,一些会计师可能喜欢将它们单独列示,但绝大多数会计师只会在报告中以不同的方式显示“负面”(例如用括号括起来)。
很有可能(像许多其他会计事项一样),双列是从许多个月前结转过来的。将两列相加,然后从正的总数中减去负的总数,以获得当前的位置(而不是以混合的方式进行加减),这将更容易。但这是我的假设。
另见此处。
需要说明的是,会计师只会使用银行账户 * 在价值本身确实通过该银行账户 * 的情况下执行两步流程。如果只是将价值从一个用户转移到另一个用户,银行账户就不会参与。
因此,用户到用户的价值转移将类似于(将交易部分与交易整体分开,以允许复杂的多账户移动)(1):
其中通过您的银行帐户传递的值可能是:
这是要记住,对于外行来说,资产/负债在对你有利的时候却有负值是很奇怪的:-)
(1)为了避免混淆(参见注解),我应该强调,将事务划分为多个部分是为了允许事务轻松地访问多个帐户代码(各种资产、费用等),事务本身仍然是单个原子操作。