2010-11-19 10 views
2

多分私はグーグルではうまくないかもしれませんが、私は金のルールと、請求に関連するデータベースを設計する際の推奨を求めています。ランニングバランスとデータベース正規化のパラダイム

私は同じで*すべての* billable_account_idのためのすべてのトランザクション事前に計算実行中のバランスを格納し、上の更新のアイデアを放棄database normalizationのルールに基づいて取引

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

とSQLテーブルを考えてみましょうトランザクションテーブルのサイズに関係なく、他の場所に格納することができます。

私はPostgresを使用していますが(問題は共通ですが)、私はSQL忍者ではありませんが、設計において賢明にしようとしています。

質問:

  1. 私は右このアプローチと一緒に行くのですか?
  2. 「はい」の場合、そのようなテーブルを維持し、合計を稼働させるためのクエリを作成するにはどのような方法をお勧めしますか?

非常に参考になります。

答えて

1

ほとんどのデータベースでは、分析関数を使用して合計を生成できます。オラクル、あなたはTRANSACTION_DATEを持っていない場合

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 

のようなもので、あなたが生成されたIDが単調に増加していることを保証できると仮定してIDを使用することができます。

しかし、パフォーマンスの観点からは、OLAP/DSSタイプのレポートの3番目の正規形正規化ルールを破らないと曲がりたいと思う可能性があります。多数のトランザクションを持つ可能性があります。たとえば、月末ごとにBILLABLE_ACCOUNT_IDの期末残高を持つ別個の表を作成し、分析機能を使用して先月の取引を前月の期末残高に追加することができます。 Oracleでは、実行中の合計を自動的に維持するマテリアライズド・ビューを作成できます。

+3

http://tech.jonathangardner.net/wiki/PostgreSQL/Materialized_Views –

+0

ありがとう!あなたは私に指示をくれた! – forker

関連する問題