如何设计数据库以计算帐户余额?
1)目前我从交易表中计算账户余额在我的交易表中我有"描述"和"金额"等.
然后我会将所有"金额"值相加,这将计算出用户的帐户余额.
我向我的朋友展示了这个,他说这不是一个好的解决方案,当我的数据库增长它会减慢???? 他说我应该创建单独的表来存储计算的帐户余额.如果这样做,我将不得不维护两个表,而且风险很大,帐户余额表可能会不同步.
有什么建议吗?
编辑:选项2:我应该在我的交易表"余额"中添加一个额外的列.现在我不需要经过多行数据来执行我的计算.
示例约翰购买100美元信贷,他债务60美元,然后他增加200美元信贷.
金额$ 100,余额$ 100.
金额 - 60美元,余额40美元.
金额$ 200,余额$ 240.
我知道在Stack Overflow上已经广泛讨论了normalis(z)ation.我读过很多以前的讨论.我有一些额外的问题.
我正在研究一个至少有100个表的遗留系统.数据库具有一些非规范化结构,包含各种不同数据的表以及其他问题.我被赋予了改善它的任务.我不能再重新开始,但需要修改现有架构.
在过去,我一直试图设计规范化的数据库.现在的问题.一位高级开发人员建议在某些情况下我们无法规范化:
1)使用时态数据.例如,创建了一个链接到产品的发票.如果客户在一年后要求提供此发票的副本,我们必须能够生成原件的精确副本.如果产品价格,名称或描述已更新怎么办?资深人士建议将价格和其他产品信息复制到发票表中.我想也许我们应该有另一个表,例如productPrice,它有一个日期字段,所以我们可以跟踪价格随时间的变化.我想对产品描述和名称需要相同的东西吗?看似复杂.你怎么看?
2)数据库是一个会计系统.我对会计不是很熟悉.目前,一些摘要数据被导出并存储在数据库中.例如,当年的总销售额.我的高级助理表示,会计师喜欢通过将此值与实际根据发票等计算的数据进行比较来检查事情是否正确,以使他们相信应用程序正常工作.他说,目前我们可以判断是否有人错误地从去年删除了发票,因为总数不会相同.他还指出,在飞行中计算这些总数可能会非常缓慢.当然,我说数据不应该重复,应该在需要时进行计算.我建议我们可以使用SQL Reporting Services或其他一些解决方案来隔夜生成这些报告并缓存它们.无论如何,他不相信.对此有何评论?
非常感谢:)
干杯
马克
感谢您的出色回应.遗憾的是我只能将其中一个作为答案,因为这里有很多好的建议.
假设有一家银行、一家大型商店等,希望正确地为内部帐户和跟踪客户帐户进行会计处理。而不是实现满足当前简单而狭隘的要求,这将是“家酿”:结果证明这些只是当前简单要求的临时拐杖,并且在出现新要求时很难或不可能扩展。
据我了解,复式记账法是一种行之有效的方法,可满足所有会计和审计要求,包括目前未考虑的要求。如果实施,它将:
我研究了另一个问题的答案:简单银行账户的衍生账户余额与存储账户余额?,它为内部帐户提供了很好的信息。需要一个数据模型,以便理解实体;他们的互动;他们的关系,@PerformanceDBA 已经给出了这一点。该模型取自该答案:

虽然这对于简单的内部账户来说是令人满意的,但我需要看到一个提供完整复式记账方法的数据模型。
需要添加的文章是Journal; 内部 vs 外部Transactions;等等..
理想情况下,我想看看这些双条目行在数据库方面的样子,整个过程在 SQL 中的样子,在每种情况下哪些实体受到影响等等。案例如下:
让我们称之为System而不是Bank,Bank可能太复杂而无法建模,让问题是关于使用帐户和资产操作的假想系统。客户与系统(存款、取款、后期费用、批量费用)以及彼此之间(转账)执行一组操作。
我想向读者推荐这里和这里的答案,因为它们具有深度和思想。我在为我正在从事的项目寻找相关内容时偶然发现了它们,我从上到下阅读它们。
我正在尝试使用这些原则(即复式会计)构建一个利基市场应用程序,并加入工作成本计算。上述答案对重塑我对会计和数据库的概念非常有帮助应该看起来和工作像。但是,我很难将等式的工作成本计算部分整合到提供的优秀图形示例中。
有几个使用 House、账户持有人、费用等的交易示例。我还有一些其他特定的用例,我很想得到一些输入:
我没有客户。我购买了房产(通常是现金流出,负债(贷款)被创造,资产(资产)被创造),花了一大笔钱来修理它(在商店兑现,信用卡收费商店,或写给供应商的支票,借记财产资产并借记或贷记资金来源),然后将其出售(现金进来,贷款已还清,希望剩下的现金比我花的钱多该项目)。这可能会创建比我上面列出的更多的分类帐条目,但我不是会计师。我想我明白我所有的成本都以我的财产为基础,如果我的净收益大于我的基础,那么我就赚钱了,如果不是,那就没有。
因此,我需要记录的费用是 a) 来自特定帐户(即公司支票帐户或所有者的 Best Buy 卡等),b) 通常与特定工作相关的费用(但并非总是如此 - 我确实有偶尔的开销费用,如办公用品),以及 c) 总是与成本代码相关联(即“100.12 - 窗户材料”、“100.13 - 窗户人工”等)。
我经常收到来自供应商的账单,这些账单将在未来某个时候到期。我想跟踪已收到但尚未支付给定工作的账单(承诺成本)。我认为这笔交易看起来像这样,但我不确定:
正如你可能从我上面关于“所有者的百思买卡”的俏皮话中推测的那样,我有时(比我应该的更频繁)使用我的个人资金来支付公司和工作相关的费用。我认为(再次声明我是外行)所有这些支出都记入“所有者权益”,并根据需要借记/贷记其他账户。
我一直在一个又大又丑的电子表格中跟踪所有这些,这就是我尝试构建一个应用程序来替换它的原因 - 电子表格方法效果不佳,而且肯定无法扩展。
我一直在研究复式记账系统的实现(特别是使用 Django 作为数据库后端)。我难以理解的是“分类账”和“总账”从会计世界到数据库/软件世界的翻译。
在会计中,我们可能会看到类似的内容:
Sales Sub-Journal:
---------------------------------------------------------------
Date Description Amount Acct Balance
---------------------------------------------------------------
Jan 1 Cust. A Sale 500.00 AR 500.00
Jan 15 Cust. B Sale 300.00 AR 800.00
General Journal:
---------------------------------------------------------------
Date Description Acct Debit Credit
---------------------------------------------------------------
Jan 15 Sales for Jan AR 800.00
Sales 800.00
Run Code Online (Sandbox Code Playgroud)
实际上,子分类帐通过单个日记帐分录复制到总分类帐。
我很难理解的是从数据库角度来看分类账和总账的目的。难道只有两个普通的日记条目就不能将上述三个条目记录在数据库中吗?这会消除重复的数据(明细账中记录的 800 美元和普通日记账分录中也记录的 800 美元)?
General Journal Entries:
---------------------------------------------------------------
Date Description Acct Debit Credit
---------------------------------------------------------------
Jan 1 Cust. A Sale AR 500.00
Sales 500.00
Jan 15 Cust. B Sale AR …Run Code Online (Sandbox Code Playgroud)