001*_*001 7 c# sql-server asp.net accounting database-design
您制作了一个游戏网站,用户可以在其中购买游戏积分,并将资金存入/存入用户的虚拟账户以进行游戏等等.
如果你有一个会计师来记录交易,它将被记录为这样(可能有点复杂,但你明白了)
TRANSACTION
PK_ID1 Cash - $10 (System)
PK_ID2 Deposit $10 (System)
TRANSACTION
PK_ID3 Bank Account - $10 (John)
PK_ID4 Deposit $10 (John)
Run Code Online (Sandbox Code Playgroud)
作为开发人员,您真的需要浪费2条额外的记录吗?为什么不这样记录呢...(那么你可以存储资金来自哪里,在同一存款记录下的其他栏目中的状态)
TRANSACTION
PK_ID1 Cash - $10 (system)
PK_ID2 Deposit $10 (John)
Run Code Online (Sandbox Code Playgroud)
选项#1优于选项#2和副签证是否有任何真正的优势?
编辑:修改过的问题,删除了CR,DR并用符号替换.
Per*_*DBA 11
(回答你的问题,但也回应了paxdiablo的答案中提出的一些观点.)
这与查看数据库内部的会计师无关.使用Double入口,错误很容易追踪; 这是一个会计和国税局的要求,所以实际上,你没有选择,你需要双重进入任何处理公共资金的系统.
(请不要试图告诉我"双重录入"是什么;我为银行编写了双重录入系统,以审计要求.)双重录入是一种基于一组帐户的会计方法.每笔金融交易都是期刊报名; 如果从头开始重新应用所有交易,那么所有账户将达到与今天完全相同的余额.
双重输入意味着每笔交易都有"收件人"和"来自"帐户; 金钱永远不会离开系统或进入系统.每个信用卡都附有借方.
因此(1)不是(2)的"复式"版本,它们不能轻易比较.John的交易的双重登记版本是(一个金融交易),采用逻辑会计术语:
从:JohnAccount到:SystemAccount金额:( 10.00美元)
这可能是表中的两行,一个是信用卡,另一个是借记,两个插入包装在SQL事务中.
这就是会计系统,它是内部的,处理货币.我们完了.
但是,您还要将会计系统与购买/销售系统结合(未明确声明).当然,你从约翰拿了十块钱,你需要给他他所购买它,并记录.约翰购买了价值10美元的游戏积分,如果你跟踪它,那么是的,你还需要:
SystemGamingAccount到:JohnGamingAccount金额:( 100信用)从:SystemGamingAccount到:JohnGamingAccount金额:( 10.00美元)
这也可能是在一个表中的两行,一个是信贷和其他借记,四个插入包裹在一个SQL事务.
要明确的是,如果您销售小部件而不是游戏积分,则第二个(小部件跟踪)交易将是:
从:Warehouse到:PublicSale金额:( 1小部件)
因为你正在跟踪单位的仓库,但不是约翰Q公众还有多少小部件的口袋里,这是两个刀片加一个更新(UPDATE Part SET QtInStock = QtyInStock - 1 WHERE PartCode = "Widget"),都包裹在一个SQL事务.
对于每个用户都有一个帐户,对吧.虚拟的,深奥的或实体的,它是一个法律实体,对其进行交易.所以我们不要假装它不存在,因为它是虚拟的.对于游戏,一美元账户加一个游戏(信用)账户.
信用卡/借记卡
我会把CR/DB放回去; 不是CHAR(2),而是布尔值.当桌子很大时,它会帮助你
WHERE IsCredit = 1
Run Code Online (Sandbox Code Playgroud)
比...快得多
WHERE Amount >= 0.
Run Code Online (Sandbox Code Playgroud)
请注意,使用"> =",您必须确保每个代码段的编码方式相同,有时不是">".布尔值或char没有这个问题.
| 归档时间: |
|
| 查看次数: |
4849 次 |
| 最近记录: |