新しいデータベースを設計する必要があるたびに、変更の監査ログを保持するためにデータベーススキーマを設定する方法を考えるのにかなりの時間を費やします。
これについてはすでにいくつかの質問がありますが、すべてのシナリオに最適なアプローチが1つあることに同意しません。
また、各アプローチの長所と短所をリストしようとする、データベース変更のログの保守に関するこの興味深い記事に出くわしました。それは非常によく書かれていて、興味深い情報を持っていますが、それは私の決定をさらに難しくしました。
私の質問は次のとおりです。私が使用できる参照、おそらく本や、次のようないくつかの入力変数に基づいてどちらの方向に進むべきかを決定するために参照できる決定木のようなものはありますか。
- データベーススキーマの成熟度
- ログの照会方法
- レコードを再作成する必要がある確率
- さらに重要なこと:書き込みまたは読み取りのパフォーマンス
- ログに記録される値の性質(文字列、数値、blob)
- 利用可能なストレージスペース
私が知っているアプローチは次のとおりです。
1.作成および変更された日付とユーザーの列を追加します
表の例:
- id
- value_1
- value_2
- value_3
- 作成日
- Modified_date
- によって作成された
- 変更された
主な短所:変更の履歴が失われます。コミット後にロールバックできません。
2.テーブルのみを挿入します
表の例:
- id
- value_1
- value_2
- value_3
- から
- に
- 削除済み(ブール値)
- ユーザー
主な短所:外部キーを最新の状態に保つ方法は?巨大なスペースが必要
3.テーブルごとに個別の履歴テーブルを作成します
履歴テーブルの例:
- id
- value_1
- value_2
- value_3
- value_4
- ユーザー
- 削除済み(ブール値)
- タイムスタンプ
主な短所:すべての監査済みテーブルを複製する必要があります。スキーマが変更された場合は、すべてのログも移行する必要があります。
4.すべてのテーブルの統合履歴テーブルを作成します
履歴テーブルの例:
- table_name
- 分野
- ユーザー
- new_value
- 削除済み(ブール値)
- タイムスタンプ
主な短所:必要に応じてレコードを簡単に再作成(ロールバック)できますか?new_value列は、すべての異なる列タイプをサポートできるように、巨大な文字列である必要があります。