Edited at

1分でわかる論理削除 -メリットとデメリットを考える-


対象読者

以下のような疑問を持つ若手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...)


最後に

当記事では論理削除の概要をとりあげました。少しでも理解が深まったのであれば幸いです。