1

タイトルがはっきりしない場合は申し訳ありません。私は今説明しようとします:

テーブルAとテーブルBの2つのテーブルがあります。それらの間の関係は1つ(Aテーブルの場合)から多数(Bテーブルの場合)です。だから、それはマスターディテールの状況のようなものです。テーブルBには明らかに10進数の列「Amount」があり、テーブルAには列「TotalAmount」があります。テーブルAの値を最新の状態に保つ方法を見つけようとしています。私の提案は、テーブルBからの金額をカウントする集計クエリを使用してテーブルAに基づいてビューを作成することです。もちろん、適切なインデックスを使用して...しかし、私のチームメイトは、テーブルAで何かを変更するたびに、テーブルAの値を更新することを提案します。アプリケーションの表B。ここで最善の解決策は何でしょうか?3番目のバリアントである可能性がありますか?

いくつかの説明...このテーブルは、データベースで最も急速に成長しているテーブルであると予想しました。そして、テーブルBはテーブルAよりもはるかに速く成長します。テーブルBで最も頻繁に行われる操作は、挿入です...そして他にはほとんど何もありません。表Aで最も頻繁に実行される操作は、選択されます...だけではありません。

4

4 に答える 4

1

いくつかのオプションがあります。

  1. テーブルBで挿入トリガーを使用し、友人の提案に従ってテーブルAを更新します。これにより、テーブルBが可能な限り最新の状態に保たれます。
  2. x分ごとにテーブルAを更新するスケジュールされたジョブがあります(x =アプリケーションにとって意味のあるもの)。
  3. テーブルBを更新するときは、アプリケーションロジックのテーブルAを更新します。多くの場所でテーブルBを更新すると、これはうまくいかない場合があります。
于 2010-02-08T09:00:53.043 に答える
1

アプリ内でテーブルBに新しい行を挿入する場所が1つしかない場合、最も簡単な解決策は、を送信して、UPDATE A set TotalAmount=TotalAmount + ? where ID = ?挿入に使用した値をBに渡すことです。両方のクエリ(挿入とトランザクションで)を更新するため、両方が発生するか、発生しないかのいずれかです。

それが単純でない場合、次のオプションはデータベーストリガーです。それらを作成する方法については、データベースのドキュメントをお読みください。基本的に、トリガーは、DBで何かが発生したとき(この場合、誰かがテーブルBにデータを挿入したとき)に実行される小さなコードです。

ビューは別のオプションですが、選択中にパフォーマンスの問題が発生する可能性があり、解決が難しい場合があります。代わりに「マテリアライズド・ビュー」または「計算列」を試してください(ただし、これらは列の挿入/削除時にパフォーマンスの問題を引き起こす可能性があります)。

于 2010-02-08T09:03:53.210 に答える
1

この値が大幅に変更される場合は、ビューを使用することをお勧めします。これは間違いなくより安全な実装です。ただし、トリガーを使用する方がさらに良いでしょう(データベースがトリガーをサポートしている場合)。

あなたの仲間は、あなたが値を頻繁に必要とし、毎回値を再計算するのが遅くなるかもしれないと彼が考えているので、挿入ごとに値を更新することを提案していると思います。その場合:

  • データベースがキャッシュを処理する必要があるため、これはおそらく問題にはなりません。
  • それでも、そうであれば、後の段階でその機能を追加できます。これにより、アプリケーションが他の方法で動作することを確認でき、そのキャッシュ列のデバッグがはるかに簡単になります。
于 2010-02-08T09:10:02.393 に答える
0

すべての呼び出し元に依存するのではなく、データベースが値を最新の状態に保つことが保証されるため、アプリケーションロジックを使用するよりもトリガーを使用することを強くお勧めします。ただし、設計の観点からは、生成されたデータを生成されていないデータと同じテーブルに格納することには注意が必要です。明確な分離を維持することが重要であると考えています。そうすれば、人々はどのデータを使用すべきか混乱しないようになります。維持し、彼らのために何を維持するか。

ただし、一般的には、トリガーよりもビューを優先します。そうすれば、値を維持することをまったく心配する必要がありません。パフォーマンスが問題であるかどうかを判断するためのプロファイル。Postgresでは、計算された値にインデックスを作成することもできると思います。そのため、データベースは詳細テーブルを調べる必要がありません。

3番目の方法である定期的な再計算は、トリガーよりもはるかに遅く、おそらくビューよりも遅くなります。とにかくそれがあなたの使用に適していないということはケーキの上のアイシングです:)。

于 2010-02-08T09:15:26.230 に答える