143
92

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-23

対象読者

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

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

143
92
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
143
92

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?