会计数据库 - 存储交易

时间:2010-11-02 03:29:25

标签: c# asp.net sql-server database-design accounting

您创建了一个游戏网站,用户可以在该网站上购买游戏积分,并将资金存入/存入用户的虚拟账户以进行游戏等...等等。

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和副签证是否真的有优势?

编辑:已修改的问题,删除了CR,DR并替换为符号。

2 个答案:

答案 0 :(得分:11)

(回答你的问题,但也回应了paxdiablo的答案中提出的一些观点。)

这与查看数据库内部的会计师无关。使用Double入口,错误很容易追踪;这是一个会计 IRS要求,所以实际上,你没有选择,你需要双重进入任何处理公共资金的系统。

  • (请不要试图告诉我“双重录入”是什么;我为银行编写了双重录入系统,以审计要求。)双重录入是一种基于一组帐户的会计方法。每笔金融交易都是期刊报名;如果从头开始重新应用所有交易,那么所有账户将达到与今天完全相同的余额。

  • 双重输入表示每笔交易都有“收件人”和“发件人”帐户;金钱永远不会离开系统或进入系统。每个信用证都附有借记卡。

  • 因此(1)不是(2)的“复式”版本,它们不容易比较。 John的交易的复式版本是(一个金融交易),采用逻辑会计术语:

    • 发件人:JohnAccount收件人:SystemAccount金额:10.00(美元)

    • 这可能是表中的两行,一个是信用卡,另一个是借记,两个插入包装在SQL事务中。

  • 这就是会计系统,它是内部的,处理金钱。我们完成了。

  • 但您还要将会计系统与购买/销售系统结合(未明确声明)。当然,对于你从约翰那里拿走的十块钱,你需要给他任何他为它买的东西,并记录下来。约翰购买了价值10美元的游戏积分,如果你跟踪它,那么是的,你还需要:

    • 发件人:SystemGamingAccount收件人:JohnGamingAccount金额:100(点数)
      或者,以美元表示:
    • 发件人:SystemGamingAccount收件人:JohnGamingAccount金额:10.00(美元)

    • 这也可能是表中的两行,一个是信用证,另一个是借记,四个插入包装在SQL事务中。

  • 要明确的是,如果您销售小部件而不是游戏积分,则第二个(小部件跟踪)交易将是:

    • 发件人:Warehouse收件人:PublicSale金额:1(小部件)

    • 既然您正在跟踪仓库中的单位,而不是John Q Public在其口袋中有多少小部件,那就是两个插入加一个更新(UPDATE Part SET QtInStock = QtyInStock - 1 WHERE PartCode = "Widget"),所有这些都包含在SQL事务中。

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

<强>信用卡/借记

我会把CR / DB放回去;不是CHAR(2),而是布尔值。当桌子很大时,它会帮助你,

    WHERE IsCredit = 1  

快得多
    WHERE Amount >= 0.

请注意,使用“&gt; =”,您必须确保每个代码段的编码方式相同,而不是“&gt;”有时。布尔或char没有这个问题。

答案 1 :(得分:2)

就数据而言(这就是你要问的),没有。您应该将其存储为签名值。复式簿记不是暴徒所做的事情,因此它可以隐藏美国国税局的实际利润: - )

这意味着必须平衡事务(永远不会创建或销毁值,只是转换)。如果你只是将它们存储在带有符号的一列中,那么平衡交易(和账簿)就会容易得多。

在视觉呈现方面,一些会计师可能会在不同的栏目中将他们喜欢,但绝大多数会产生报告,其中“负面”只是用不同的方式表示(例如用括号括起来)。

很可能(就像许多其他会计事项一样),双列是从许多月前开始的。将两列相加然后从正总数中减去负总数以获得当前位置会更容易(而不是以混合方式添加和减去)。但那是我的假设。

另见here