2009-03-23 4 views
3

私はかなり長いビジネスプロセスを経て、最終的には財務操作になります。正規化(SQLビュー)とパフォーマンス/フィーチャビリティ(SQLテーブル)とのトレードオフはどこですか?

最終的に重要なことは、これらの最終的な操作だけですが、私はそれにつながったすべてのログを残しておく必要があります。

最終的な操作に含まれるすべての情報は、(ビジネスプロセスで使用される)他のテーブルで使用できるため、ビューを使用するのは理にかなっていますが、ビューロジックは非常に複雑です(数多くのテーブルが関与しています) 、と私はと心配だ。(私のテーブルには、項目場合、最終的に数百万人が含まれていますし、ほぼすべてのその列に完全に検索する必要があります)

  1. も適切なインデックスと、テーブルはおそらく道速くなります

  2. ビューのロジックが複雑になる可能性があるので、複雑になる恐れがあります私がビジネスロジックを進化させたいなら、数年。そのため、これらの二つの理由の

、私の代わりにビューに頼るの私のビジネス・プロセスの最後にテーブルにデータを書き込むように誘惑少しだけど、データを複製することは(右のにおいはありませんそれは早すぎる最適化のようにも見えますが、設計上の中心点なので、すぐに問題を解決したいと思います)

これまでにこのような選択に直面しましたか?あなたは何を決めましたか?

編集:テーブルを作成すると明らかに私の状況に重複が生じます。テーブルに書き込まれたデータはデータベースのどこかに存在し、計算なしで結合のみを使用して取り出すことができます。

答えて

3

私はBrannを書き留めて質問に答えたと思います。

この問題はこのように表示されます。片方の手では、「リアルタイムデータ」があります。あなたは新鮮なデータを持っており、そこから「リアルタイムデータ」を表示するビューを作成するのもいいですね。

しかし、時間が経つにつれて、データとロジックの変更が増えています。だから、あなたがしばらく前に持っていたデータの要約を書き留めておきましょう。非常に実用的です。データを再計算し、それらのテーブルの新しい要約に保存するため、データを複製しません。

このように考えると、この例では新しいテーブルが優れていることは明らかです。あなたが書いている:

  • 迅速なアクセス
  • は、あなたがこの(またはその一部)を満たしたときにロジックがそう

を変更したときに

  • はそのままアーカイブデータを持っているより多くの複雑なロジックを持つことができ、この基準のあなたとあなたのテーブルに入る。

    ビューを使用するのは、他の新鮮なデータから新鮮なデータを表示する場合だけです。非常に、非常に単純な問題です。さらに複雑になると、常に新しいテーブルに切り替わります。

    だから、それに入るのを恐れないでください。高速なアクセスを持つサマリーテーブルを1つ持つことは非常にきれいな解決策であり、それは整形式データベースの兆候です。

    ビジネスロジックが変更されたときに、このテーブルの設計に注意してください。このテーブルのすべてのストーンからすべてを変更する必要はありません。そして、すべてがOKになります!

  • +0

    は、私は完全には理解していないビューの概要とアーキテクチャをマテリアライズド。私には明らかにいくつかの重複があります。なぜなら、さまざまなテーブルでデータを取得し、最終的なテーブルに挿入するためにビューを結合するのではなく、そのテーブルに挿入するからです。 – Brann

    +0

    私にとって、データの複製は、ある場所のようなデータを取って普通の場所にコピーするときに発生します。しかし、あなたが何らかの計算をすると、それはもはや重複ではありません。同じように、製品リストと製品表の合計金額が注文表にあるように - 重複ではなく、計算です。 –

    +0

    @tomaszs:多分私は自分の状況をはっきりと表現していないかもしれません。私がやっていることは明らかに重複、つまり、複雑な結合を使って複数のテーブルから利用できるデータを1つのテーブルにコピーすることです。 – Brann

    0

    私はいつもより良い正規化をすることに決めました。あなたのケースでは、ビューが複雑になるかもしれませんが、それは新しいテーブルよりも良いことです。これは、すべてのデータ変更操作と同期して保持する必要があります。終了日は、 1日に数時間しか通用しません。

    また、この表のデータが何らかの理由で同期外れすると、より大きな問題が発生します。

    +0

    私のテーブルは常に最新のものになります(私は、1日の終わりまでではなく、すべてのビジネスオペレーションの最後にそれを設定します)。あなたが正しいと言われている、私のジレンマは、正規化対実用主義です。 – Brann

    2

    私はこの状況では新しいテーブルです。このビューには、パフォーマンスがはっきりとはっきりしていないこと、複雑さがあること、ロジックがロックされていることなどの多くの欠点があります。しかし、IMHOの根底にある理由は、基礎となるデータが変わると、ビューの値も変わるからです。ほとんどの場合、これは良いことですが、財務運営では何が起こったのかについての一定の記録を持つ方が良いわけではありません。

    0

    MrTellyが指摘したように、最終結果テーブルが本当にビューデータの複製であることを確認してください。または、実際には、ビュー・データ内の項目の結果として取られた最終アクションのレコードです。

    もっと明確な例として、私のガスタンクが半分空になるたびに私は10ドルのガスを買うとしましょう。私はこれをログに書きます。ある日、私はガスを買ってログに書き込んだ後、私の燃料ゲージが壊れていて、実際にはガスのタンクが3/4になっていることが分かりました。基礎データ(タンク内のガスレベル)が変更されたため、私は現在ログから$ 10の購入を消去する必要がありますか?さて、それは明確なの例ではないかもしれませんが、うまくいけば、それはポイントを取得します。結果を記録することは、結果をもたらしたイベントを記録することとは異なることです。これは特に金融アプリケーションで当てはまります。したがって、自分のテーブルに最終結果を格納して正規化を破っていることはわかりません。

    +0

    @Tom:この点を明確にするために質問を更新しました。 – Brann

    0

    インデックス付きです。しかし、このアプローチにはいくつかの制限がありますが、間違って実装されているとオーバーヘッドの問題がありますが、全体的に有利です。このアプローチでは、ベーステーブルで行われる変更を追跡する必要はなく、データは自分のインデックス付きビューにうまく蓄積されます。理論的には。

    はリファレンス: