2

私は J2EE 開発者で、PostgreSQL データベースで hibernate マッピングを使用しています。

データベースで発生した変更を追跡する必要があります。つまり、フィールドの以前の値と現在の値をすべて保存する必要があります。各フィールドは任意の型 (bytea、int、char...) にすることができます。

単純なテーブルでは簡単ですが、オブジェクトのグラフではより困難です。

つまり、UML の観点から言えば、すべての変更とユーザーと共にデ​​ータベースに格納するオブジェクトのグラフがあります。

それを行う方法のアイデアやパターンはありますか?

4

2 に答える 2

1

現在の RDBMS 実装は、一時データの処理があまり得意ではありません。これが、トリガーを介して個別のジャーナリング テーブルを維持することが通常のアプローチである理由の 1 つです。(もう 1 つの理由は、監査証跡には通常のデータとは異なるユースケースが頻繁にあり、それらを別々のテーブルに置くと、それらへのアクセスの管理が容易になることです)。オラクルはトータル・リコール製品で配管を隠すというかなり巧妙な仕事をしていますが、オラクルであるため、これには$$$を請求します。

Scott Bailey は、PostgreSQL の一時データに関するプレゼンテーションを公開しました。残念ながら、今は役に立ちませんが、8.5 と 8.6 で計画されているいくつかの機能では、時間関連データの透過的なストレージが有効になるようです。 詳細をご覧ください

于 2010-03-28T04:19:59.193 に答える
1

これを行う一般的な方法は、オブジェクトのバージョンを保存することです。

監査証跡を保存する各テーブルに「version」フィールドと「deleted」フィールドを追加する場合は、通常の更新と削除を行う代わりに、次のルールに従います。

  • 挿入 - バージョン番号を 0 に設定し、通常どおり挿入します。
  • 更新 - バージョン番号を増やし、代わりに挿入を行います。
  • 削除 - バージョン番号を増やし、削除されたフィールドを true に設定し、代わりに挿入を行います。
  • 取得 - バージョン番号が最も高いレコードを取得し、それを返します。

このパターンに従うと、更新するたびに古いデータを上書きするのではなく、新しいレコードが作成されるため、常に追跡してすべての古いオブジェクトを表示できます。

これは、オブジェクトのグラフに対してもまったく同じように機能します。オブジェクト グラフ内の各テーブルに新しいフィールドを追加し、上記のように各テーブルの挿入/更新/削除を処理するだけです。

どのユーザーが変更を行ったかを知る必要がある場合は、「ModifiedBy」フィールドも追加するだけです。

(DA レイヤー コードでこの処理を行うか、必要に応じてデータベース トリガーを使用して更新/削除/取得の呼び出しをキャッチし、ルールに従って再処理することができます。)

更新ごとに完全に新しいレコードが作成されるため、明らかに、スペース要件を考慮する必要があります。アプリケーションの更新頻度が高い場合、大量のデータが生成されます。データベースをオフラインで処理し、必要以上に古いデータを削除できるように、「最終更新時刻」フィールドも含めるのが一般的です。

于 2010-03-27T20:11:44.100 に答える