计费数据库 - 存储交易

计费数据库 - 存储交易

问题描述:

你让一个游戏网站,用户可以在购买游戏积分和资金存入/贷记到用户的虚拟账户玩一些游戏等等等等。计费数据库 - 存储交易

如果你有一个会计记录交易,它会被记录是这样的(也许有点复杂一些,但你明白了吧)

TRANSACTION 
PK_ID1 Cash  - $10 (System) 
PK_ID2 Deposit  $10 (System) 

TRANSACTION 
PK_ID3 Bank Account  - $10 (John) 
PK_ID4 Deposit  $10 (John) 

作为开发人员,你真的需要浪费2个额外的记录吗?为什么不只是记录它像这样......(那么你可以存储相同的存款记录下其他列,其中资金是从哪里来的信息,状态)

TRANSACTION 
PK_ID1 Cash  - $10 (system) 
PK_ID2 Deposit  $10 (John) 

有没有的选项#1任何真正的优势在选项#2和副签证?

编辑:改性问题,除去CR,DR,并用符号代替。

+0

可能重复的[会计数据库 - 存储信用卡和借记卡?](http://*.com/questions/4074425/accounting-database-storing-credit-and-debit) - 必须是会计星期SO: - ) – paxdiablo 2010-11-02 03:43:12

+1

@paxdiablo:重复的问题,是的。同一用户?是的。 90分钟后问了这个问题。 – NotMe 2010-12-21 19:39:03

(回答你的问题,但也应对在paxdiablo的回答提出的一些要点。)

这是无关的会计师找你的数据库中。使用双输入,错误很容易追踪;这是一个会计国税局的要求,所以真的,你没有选择,你需要任何系统处理公共资金的双重入场。

  • (请不要试图告诉我什么是“双项”是,我已经写了双输入系统为银行,审计要求)复式是一种核算方法的基础上,一组帐户。每笔金融交易都是日记账分录;如果所有交易从一开始就被重新应用,所有账户的余额将与现在的余额完全相同。

  • 双项意味着每笔交易都有一个“要”和“从”账户;金钱永远不会离开系统或进入系统。每个信用都附有一个借记卡。(1)不是(2)的“复式”版本,它们不易被比较。约翰的交易的双项版本(一个金融交易),在逻辑会计术语:

    • 来源:JohnAccount为:SystemAccount金额:10.00(美元)

    • 这很可能是两行一个表,一个贷方,另一个借方,这两个插入包装在一个SQL Transaction中。

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

  • 但您还将会计系统与购买/销售系统结合在一起(未明确声明)。当然,对于你从约翰那里拿下的十块钱,你需要给他买任何他买来的东西,并记录下来。约翰买了十块钱值得游戏学分,如果你追踪,那么,您还需要:

    • 来源: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. 

注意,与“> =”你必须确保每个代码段进行编码以同样的方式,有时不是“>”。布尔或char没有这个问题。

+1

@LittleTreeX littlegreen?你对这个问题感到困惑吗?或许可以问一个问题,清除你的困惑,而不是要求别人提出意见。 – PerformanceDBA 2010-12-21 18:49:26

+0

记住SO不是论坛,这个问题不是一个线程。当我读到你的答案时,它非常假设我已经阅读@ paxdiablo的答案,如果/当你的答案是upvoted时,情况就不会如此,所以它被列在最上面。你应该尝试编辑你的答案,以便更好地独立(或者明确地说,这部分是对@ paxdiablo答案的回应,否则它最终会让读者感到困惑。) – jalf 2010-12-21 19:46:37

+0

@jalf。谢谢。编辑我的答案。 – PerformanceDBA 2010-12-21 20:01:52

就数据而言(这就是你要问的),没有。您应该将其存储为有符号值。复式记账法是不是暴民这样做,它可以隐藏国税局真正的利润:-)

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

在视觉呈现方面,一些会计师可能喜欢他们在单独的列,但绝大多数会产生与“阴性”只是表示不同的报告(如用括号包围它们)。

这可能是(像许多其他会计事),双列从很久以前发扬光大。将两列相加然后从正数中减去负数总和以得到当前位置(相对于以混合方式进行加减)会更容易。但这是我的假设。

here见。

+0

已编辑的问题,问题是,1)将记录存储为会计师喜欢它的双重输入!或者2)将记录存储为单个条目,就像开发人员喜欢它一样! :) – 001 2010-11-02 03:52:06

+1

请参阅我的链接。除非你的会计师要在原始数据中查看你的数据库,否则不要考虑将它们分开:-)数据库用于存储数据,而不是呈现信息(忽略数据实际上可能是演示信息的可能性,但这是不是这里的情况)。 – paxdiablo 2010-11-02 03:56:05

+0

它只有1个表,选项1,共使用4条记录,而选项2只使用2条记录。 – 001 2010-11-02 03:59:36