質問

トランザクションデータの履歴を保存する方法を決定しようとしています。

レコードを毎回新しいタイムスタンプで再挿入する単一のテーブルに保存する必要がありますか?

履歴データを別の「history」テーブルに分割し、現在のデータのみを「active」テーブルに保持する必要があります。

もしそうなら、どうすればそれを行うのが最善ですか?自動的にデータを履歴テーブルにコピーするトリガーを使用して?または、アプリケーションのロジックを使用しますか?

ウェルボッグのコメントごとに更新:

大量の履歴データがあります(数十万行-最終的には数百万行)

主に履歴データに対して検索およびレポート操作が実行されます。

パフォーマンスは懸念事項です。検索結果を生成するために一晩中実行する必要はありません。

役に立ちましたか?

解決

要件がレポート専用の場合は、別のデータウェアハウスを構築することを検討してください。これにより、緩やかに変化するディメンションのようなデータ構造を使用できます。これは、履歴レポートにははるかに優れていますが、トランザクションシステムではうまく機能しません。また、結果の組み合わせにより、履歴レポートが本番データベースから移動し、パフォーマンスとメンテナンスが向上します。

この履歴をアプリケーション内で使用可能にする必要がある場合は、何らかのバージョン管理機能または論理削除機能を実装するか、すべてを完全に矛盾させて再定義する必要があります(つまり、トランザクションは削除されず、元に戻され、再表示されます)。これが非常に複雑になるため、 本当に これが必要かどうかを慎重に検討してください。履歴状態を正しく再構築できるトランザクションアプリケーションを作成することは、見た目よりもかなり困難です。金融ソフトウェア(保険引受システムなど)は、あなたが考えている以上にこれを実行できません。

監査ログのためだけに履歴が必要な場合は、シャドウテーブルと監査ログトリガーを作成します。これは、アプリケーション内で監査ログを正しく包括的に実装しようとするよりもはるかに簡単で堅牢です。トリガーは、アプリケーション外部のソースからデータベースへの変更も取得します。

他のヒント

この質問は、ビジネスロジックに沿ったものです。まずビジネス要件を把握してから、そこから始めます。データウェアハウスは、このような状況に適したソリューションです。 ETLは、データフローを処理するための多くのオプションを提供します。 「履歴」と「アクティブ」の基本概念は非常に正しいです。すべてのディメンションテーブルとファクトテーブルを備えたデータウェアハウスに保存すると、履歴データはより効率的かつ柔軟になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top