対象読者
以下のような疑問を持つ若手ITエンジニアの方々
・論理削除フラグを見たことはあるけど、何のためにあるのかよく分かっていない
論理削除とは何か
テーブルから特定の行を"論理的に"削除すること
そのまんま過ぎますね。
物理削除の意味が理解できれば、論理削除の意味もわかってくると思います。
削除方式 | 意味 |
---|---|
物理削除 | ハードディスクなどの記憶媒体から当該行のデータを削除すること |
論理削除 | 当該行が削除されたことをデータとして表現することで削除されたものとみなすこと (=データは記憶媒体に残ったまま) |
"削除されたことをデータとして表現する"ための手段として使用されるのが論理削除フラグです。
論理削除フラグの具体例
商品テーブル
商品ID | 商品名 | 価格 | 論理削除フラグ |
---|---|---|---|
1 | みかん | 60 | false |
2 | りんご | 150 | false |
3 | バナナ | 140 | true |
論理削除されたデータは、システムの利用者から見ると「存在しない」ことにするのが一般的です。
例えば、ユーザーがシステムの画面から商品の一覧を確認する場合、発行されるSQLは以下のようになります。
SELECT product_name, price
FROM products
WHERE is_deleted = FALSE
検索条件に論理削除フラグをFALSEにすることで、論理削除されたデータ(is_deleted=TRUE)は表示されなくなります。
論理削除フラグの名称・型
論理削除フラグの名称や型は現場によってまちまちです。
一般的には、削除されるデータがTRUEや1などの肯定的な値をとります。
反対に、削除されていないデータにはFALSEや0が入ります。
例 | |
---|---|
命名 | is_deleted, delete_flg, etc. |
データ型 | boolean, int, varchar, etc. |
#なぜ論理削除が必要なのか
様々な理由が考えられますが、以下のようなケースが多いと思います。
- ユーザーからその存在を隠蔽したいが、データとしては残しておきたい
(例えば、業務事情により当該データを使用禁止にしたいが、一時的なのですぐに元に戻せるようにしたい場合) - 誤って削除した場合に備え、すぐにデータを復元できるようにしておきたい
#なぜ論理削除は嫌がられるか
- バグを生み出す原因になる (例:WHERE句への論理削除フラグの付け忘れ)
- データ量増大やそれに伴う検索性能の劣化 ※論理削除データが多い場合
#論理削除という設計方式は悪か?
ケースバイケース
業務要件を踏まえて要検討。ただ、従来の慣習に合わせた「とりあえず論理削除フラグ」はやめましょう。
#論理削除フラグの代替案
このあたりはもう少し調査が必要だと思っていますが、1案だけあげておきます。
- 削除時、削除用テーブルにINSERTする(トリガーを使う)
- (Coming soon...)
#最後に
当記事では論理削除の概要をとりあげました。少しでも理解が深まったのであれば幸いです。