【问题标题】:Django webapp - tracking financial account informationDjango webapp - 跟踪财务账户信息
【发布时间】:2011-09-18 04:57:54
【问题描述】:

我需要一些编码建议,因为我担心我正在创建效率低下的臃肿代码。

我有一个跟踪公司财务数据的网络应用。我有一个名为Accounts 的表,其中包含与典型财务账户相对应的记录集合,例如收入、现金、应付账款、应收账款等。这些记录只是作为外键指向的名称持有者。

我还有一个名为Account_Transaction 的表,它记录了Accounts 中所有账户的所有进出资金交易。从本质上讲,Account_Transaction 表完成了所有繁重的工作,同时指向正在更改的各个帐户。

例如,进行销售时,会在Account_Transaction 表中创建两条记录。一条记录增加现金余额,另一条记录增加收入余额。

Trans Record 1:
  Acct: Cash
  Amt:  50.00
  Date: Nov 1, 2011

Trans Record 2:
  Acct: Revenue
  Amt:  50.00
  Date: Nov 1, 2011

所以现在我有两条记录,但它们都指向不同的帐户。现在,如果我想查看我的现金余额,我必须查看 每个 Account_Transaction 记录并检查该记录是否涉及现金。如果是这样,则添加/减去该记录的数量并移至下一条。

在一个典型的工作日内,可能会有超过 200-300 笔与上述类似的交易。因此,Account_Transaction 表将很快增长。几个月后,该表可能有几千条记录。诚然,这对于数据库来说并不算多,但是,每次用户想知道例如应收账款的当前余额时,我都必须遍历整个 Account_Transaction 表来汇总处理账户名称的所有记录“应收账款”。

我不确定我是否以最优化的方式设计了这个。我曾考虑为每个帐户创建一个不同的表(一个用于“现金”,另一个用于“应收账款”,另一个用于“收入”等...),但通过这种方法,我创建了 15-20 个具有完全相同参数的表, 除了他们的名字。这似乎是糟糕的设计,所以我采用了这个Account_Transaction 的想法。

这似乎是处理此类数据的合适方法吗?有没有更好的方法可以让我真正采用?

谢谢!

【问题讨论】:

    标签: django database-design


    【解决方案1】:

    为什么需要遍历所有记录来确定Accounts Receievable 帐户的状态?我认为您不能只在 Django ORM 中使用 .filter 来选择性地选择您需要的记录,我是否错过了什么?

    随着记录的增长,您可以在报告中添加一些日期过滤。在大多数情况下,您的会计师只需要本季度、本月等的数字,而不是完整的历史数据。

    向该列添加索引以优化选择,然后查看 Djangos aggregation 以汇总数据库中的值。

    最后,您可以做一些保守的缓存来加快“快速查看”样式报告的速度,在这种情况下您只需要非常快速的总数,但是您需要小心不要出现误报,因此请重置该缓存对记录的任何更改都是必须的。

    【讨论】:

    • 那么,当我对查询集进行过滤时,该操作的计算量不是很大吗?我计划使用过滤器运算符,但只是假设这仍然是一种对一个帐户的所有记录求和的效率略低的方法。在我寻找其他人如何做到这一点时,我遇到了一篇有趣的文章,其中讨论了如何最好地解决这个设计问题。对于其他可能觉得它有用的人:homepages.tcp.co.uk/~m-wigley/gc_wp_ded.html
    • 如果您已正确索引表,则操作不会很繁重。您甚至可以通过 Django 模型语法指定索引,它会为您设置它们。我相信缓存结果在某些情况下也可以工作,但您需要对您的失效非常严格。
    【解决方案2】:

    您为什么不跟踪Account 表中的确切可用金额? Account_Transaction 只能用于查看交易历史。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-26
      • 2013-09-23
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2020-02-19
      相关资源
      最近更新 更多