会计数据库 – 存储交易

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

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

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

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

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

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

  • 双重输入意味着每笔交易都有“收件人”和“来自”帐户; 金钱永远不会离开系统或进入系统。 每个信用卡都附有借方。

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

    • 来自: JohnAccount To: 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. 

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

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

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

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

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

另见这里 。