2010-11-19 47 views
2

也许我不擅长使用谷歌搜索,但我正在寻求设计与计费相关的数据库的一套黄金规则和建议。运行平衡和数据库规范化范例

可以说我有,而基于database normalization规则我放弃存储和每笔交易更新有关的想法交易

transactions(id int, credit float, debit float, billable_account_id int) 

SQL表预先计算的运行平衡,每* billable_account_id *在同一表或其他地方,而不管事务表的大小。

我使用Postgres如果重要的话(虽然主题是常见的),我不是一个SQL忍者,但试图在设计迂腐。

问题:

  1. 我说得对不对这种方法去?
  2. 如果是的话,你会建议在维护这样的表和编写查询获得运行总数时使用哪些方法?

任何引用都非常感谢!

回答

1

您可以使用分析函数在大多数数据库中生成运行总数。在Oracle中,像

SELECT billable_account_id, 
     SUM((CASE WHEN credit IS NOT NULL THEN credit 
        WHEN debit IS NOT NULL THEN -1 * debit 
        ELSE 0 
        END)) OVER (PARTITION BY billable_account_id 
            ORDER BY transaction_date) running_total 
    FROM transactions 

如果没有TRANSACTION_DATE,您可以使用ID假设你能保证生成的ID是单调递增。

但是,从性能的角度来看,如果不打破OLAP/DSS类型报表的第三范式规范化规则,您可能会想要弯曲,因为人们想要非常频繁地报告总计并且某些帐户是可能会有大量的交易。例如,您可能希望为每个月末的每个BILLABLE_ACCOUNT_ID创建一个结尾余额的单独表格,然后使用分析函数将当前月份的交易添加到上个月的期末余额。在Oracle中,您可能需要创建一个物化视图,以自动维护运行总量。

+3

http://tech.jonathangardner.net/wiki/PostgreSQL/Materialized_Views – 2010-11-19 21:50:12

+0

谢谢各位!你给了我方向! – forker 2010-11-20 00:23:58