asp.net 会计数据库-存储交易

lndjwyie  于 2023-03-13  发布在  .NET
关注(0)|答案(2)|浏览(197)

你做一个游戏网站,用户可以购买游戏积分,资金存入/存入用户的虚拟帐户,玩一些游戏等...等。

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并替换为符号。

t98cgbkg

t98cgbkg1#

(回答了你的问题,但也回答了paxdiablo回答中提出的一些观点。)
这与会计人员查看你的数据库无关。使用复式记账,错误很容易被追踪;这是一个会计国税局的要求,所以真的,你没有选择,你需要复式分录的任何系统,处理公共资金。

  • (请不要试图告诉我什么是“复式记账”;我为银行写过复式记账系统,以满足审计的要求复式记账是一种会计方法,它以一套账户为基础,每一笔财务交易都是日记账;如果从一开始就重新应用所有交易,则所有帐户的余额将与它们今天的余额完全相同。
  • 复式记账是指每笔交易都有一个“收”账户和一个“出”账户;钱从不离开系统或进入系统。2每一个贷方都有一个借方。
  • 因此,(1)不是(2)的“复式记账”版本,它们不容易比较,约翰交易的复式记账版本是(一笔财务交易),用逻辑会计术语来说:
  • 发件人:JohnAccount收件人:SystemAccount数量:(美元)
  • 这很可能是表中的两行,一行是贷方,另一行是借方,这两个插入被 Package 在一个SQL事务中。
  • 会计系统就这样了,它是内部的,和钱打交道。我们完成了。
  • 但是,您还将会计系统与购买/销售系统结合在一起(没有明确声明)。当然,对于您从John那里拿走的10巴克斯,您需要将他购买的任何东西都给他,并记录下来。John购买了价值10美元的游戏点数,如果您正在跟踪这些点数,那么是的,您还需要:
  • 发件人:SystemGamingAccount收件人:JohnGamingAccount数量:100(学分)

或以美元计:

  • 发件人:SystemGamingAccount收件人:JohnGamingAccount数量:(美元)
  • 这也可能是表中的两行,一行是贷方,另一行是借方,这四个插入被 Package 在一个SQL事务中。
  • 需要说明的是,如果您出售的是小工具而不是游戏积分,则第二个(小工具跟踪)交易将是:
  • 发件人:Warehouse收件人:x1立方米10立方米1x数量:1(小工具)
  • 由于您跟踪的是仓库中的单元,而不是John Q Public口袋里有多少小部件,因此需要两次插入加上一次更新(UPDATE Part SET QtInStock = QtyInStock - 1 WHERE PartCode = "Widget"),所有这些都封装在一个SQL事务中。

每个用户都有一个账户,对吧。虚拟的,神秘的或物理的,它是一个法律的实体,对它进行交易。所以让我们不要假装它不存在,因为它是虚拟的。对于游戏,一美元的账户加上一个游戏(信用)账户。

贷方/借方

我会把CR/DB放回去;不是CHAR(2),而是布尔值。当表很大时,它会帮助您以后使用。

WHERE IsCredit = 1

WHERE Amount >= 0.

注意,使用“〉=”时,你必须确保每个代码段的编码方式相同,而不是有时使用“〉”。布尔型或字符型没有这个问题。

g52tjvyc

g52tjvyc2#

至于数据(这就是你要问的),不。你应该把它存储为一个有符号的值。复式簿记不是暴民做的事情,这样它就可以向国税局隐藏真实的的利润:-)
这意味着交易必须是平衡的(价值永远不会被创造或毁灭,只是被转换)。如果你只是把它们存储在一个有符号的列中,平衡交易(和账簿)会容易得多。
在视觉呈现方面,一些会计师可能喜欢将它们单独列示,但绝大多数会计师只会在报告中以不同的方式显示“负面”(例如用括号括起来)。
很有可能(像许多其他会计事项一样),双列是从许多个月前结转过来的。将两列相加,然后从正的总数中减去负的总数,以获得当前的位置(而不是以混合的方式进行加减),这将更容易。但这是我的假设。
另见此处。
需要说明的是,会计师只会使用银行账户 * 在价值本身确实通过该银行账户 * 的情况下执行两步流程。如果只是将价值从一个用户转移到另一个用户,银行账户就不会参与。
因此,用户到用户的价值转移将类似于(将交易部分与交易整体分开,以允许复杂的多账户移动)(1):

Transactions:
    Txn#   Description
       1   Transfer from Alice to Bob
TransactionParts:
    Txn#   Account                Value
       1   Alice account (liab)      10
       1   Bob account   (liab)     -10

其中通过您的银行帐户传递的值可能是:

Transactions:
    Txn#   Description
       1   Transfer from Alice via account
TransactionParts:
    Txn#   Account                Value
       1   Alice account (liab)      10
       1   Bank account (asset)     -10
       1   Bank account (asset)      10
       1   Bob account   (liab)     -10

这是要记住,对于外行来说,资产/负债在对你有利的时候却有负值是很奇怪的:-)
(1)为了避免混淆(参见注解),我应该强调,将事务划分为多个部分是为了允许事务轻松地访问多个帐户代码(各种资产、费用等),事务本身仍然是单个原子操作。

相关问题