仕事で使っているDBテーブルに、「論理削除フラグ」「有効フラグ」というカラムが併設されていることが話題に上がったのでメモ。
基本の運用
- データの通常時 -> 有効フラグ = 1, 論理削除フラグ = 0
- データが無効になった場合 -> 有効フラグ = 0, 論理削除フラグ = 0
- データを消したい場合 -> 有効フラグ = 0, 論理削除フラグ = 1
問題点
オペミスなどで、基本の運用の 3. が、有効フラグ = 1, 論理削除フラグ = 1 の場合があるかもしれない。(実際ありそうな気がして怖い)
そうすると下記のSQLに引っかからなくなる。
SQL
SELECT *
FROM table
WHERE enabled = 0 AND deleted = 1
あとは、カラムが増えるし、レコードが減ることもなくも永久的に増えていく。
それに、SQLに必ず条件を書かなければいけない。
解決案
- 論理削除フラグと有効フラグを状態を保存するカラムに纏める。0:有効、1:無効、3:削除 のような
- 削除するレコードは削除テーブルに移動する
- いっそ「戻す必要があるかもしれない」という概念は無いとして、物理削除してしまう