12


7

過去のトランザクションデータをどのように格納するべきかを判断しようとしています。

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

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

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

  • Welbogのコメントごとに更新:*

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

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

パフォーマンスが問題です。 検索を実行するために検索を一晩中実行する必要はありません。

2 Answer


9


要件がレポート専用である場合は、別のデータウェアハウスを構築することを検討してください。 これにより、履歴レポートには非常に適していますがトランザクションシステムではうまく機能しない、ゆっくり変化するディメンションなどのデータ構造を使用できます。 結果として得られる組み合わせは、実績レポートを運用データベースから移動させます。これはパフォーマンスとメンテナンスの面で有利になります。

この履歴をアプリケーション内で利用可能にする必要がある場合は、何らかのバージョン管理機能または論理的削除機能を実装するか、すべてを完全に対比して言い換える必要があります。 取引は削除されることはなく、取り消されて再表示されるだけです。 あなたが*本当に*これを必要とするかどうかについては非常に慎重に考えてください。 履歴状態を正しく再構築できるトランザクションアプリケーションを作成することは、見かけよりもかなり困難です。 金融ソフトウェア(例: 保険引受システム)は、あなたが思う以上にこれをすることができません。

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


2


この質問はビジネスロジックの方針に沿っています。 まずビジネス要件を把握してから、そこから始めてください。 データウェアハウスは、このような状況に適したソリューションです。 ETLは、データフローを処理する際に多くの選択肢を提供します。 「歴史」と「アクティブ」のあなたの基本的な概念は全く正しいです。 すべてのディメンション表およびファクト表とともにデータウェアハウスに保管すると、履歴データがより効率的かつ柔軟になります。