これを行う一般的な方法は、オブジェクトのバージョンを保存することです。
監査証跡を保存する各テーブルに「version」フィールドと「deleted」フィールドを追加する場合は、通常の更新と削除を行う代わりに、次のルールに従います。
- 挿入 - バージョン番号を 0 に設定し、通常どおり挿入します。
- 更新 - バージョン番号を増やし、代わりに挿入を行います。
- 削除 - バージョン番号を増やし、削除されたフィールドを true に設定し、代わりに挿入を行います。
- 取得 - バージョン番号が最も高いレコードを取得し、それを返します。
このパターンに従うと、更新するたびに古いデータを上書きするのではなく、新しいレコードが作成されるため、常に追跡してすべての古いオブジェクトを表示できます。
これは、オブジェクトのグラフに対してもまったく同じように機能します。オブジェクト グラフ内の各テーブルに新しいフィールドを追加し、上記のように各テーブルの挿入/更新/削除を処理するだけです。
どのユーザーが変更を行ったかを知る必要がある場合は、「ModifiedBy」フィールドも追加するだけです。
(DA レイヤー コードでこの処理を行うか、必要に応じてデータベース トリガーを使用して更新/削除/取得の呼び出しをキャッチし、ルールに従って再処理することができます。)
更新ごとに完全に新しいレコードが作成されるため、明らかに、スペース要件を考慮する必要があります。アプリケーションの更新頻度が高い場合、大量のデータが生成されます。データベースをオフラインで処理し、必要以上に古いデータを削除できるように、「最終更新時刻」フィールドも含めるのが一般的です。