1. ホーム
  2. database-design

[解決済み] データベース内のレコードをバージョン管理する方法【終了しました

2022-04-13 06:31:21

質問

データベースにレコードがあり、管理者と一般ユーザーの両方が更新を行えるとします。

このテーブルのすべての変更をバージョン管理し、レコードを以前のリビジョンにロールバックできるようにする方法について、どなたか良いアプローチ/アーキテクチャを提案していただけませんか?

どのように解決するのですか?

例えば FOO テーブルがあり、管理者とユーザーが更新することができます。 ほとんどの場合、FOOテーブルに対するクエリを書くことができます。 幸せな日々です。

そして、その後に作成する FOO_HISTORY テーブルを作成します。 のすべてのカラムを持ちます。 FOO テーブルを使用します。 主キーはFOOと同じで、RevisionNumberカラムを加えたものです。 からの外部キーがあります。 FOO_HISTORY から FOO . また、UserId や RevisionDate など、リビジョンに関連するカラムを追加することもできます。 のすべてで、RevisionNumbers を増加させるように入力します。 *_HISTORY テーブルを使用する(Oracleシーケンスまたは同等のもの)。 1秒間に1回しか変更がないことを前提にしない (すなわち RevisionDate を主キーに設定します。)

これで、更新するたびに FOO 更新する前に、古い値を FOO_HISTORY . プログラマーが誤ってこのステップを見逃すことがないように、設計の基本的なレベルでこれを行うのです。

から行を削除したい場合 FOO には、いくつかの選択肢があります。 カスケードしてすべての履歴を削除するか、論理的な削除を実行するために FOO を削除しました。

この方法は、現在の値にほとんど興味がなく、たまに履歴を見る程度である場合に適している。 もし常に履歴を必要とするのであれば、有効な開始日と終了日を設定し、すべてのレコードを FOO そのものです。 そして、すべてのクエリーはこれらの日付をチェックする必要があります。