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