SQL
データベース
データべース設計

データベースの論理削除について考えてみた

物理削除と論理削除

データベースのレコードの削除には「物理削除」と「論理削除」の2つがあります。

まず、物理削除とはテーブルのレコードをdelete文を用いて、削除する方法です。

physical_delete.sql
DELETE FROM test  WHERE id = 123;

削除したレコードは直接テーブルから削除されるので、レコードの復旧が難しいです。

一方、論理削除では、テーブルのカラムにdelete_flagなどの削除フラグをつけます。削除する場合にはdelete_flag = 1 に更新し、参照する場合はこのdelete_flagをチェックしてdelete_flag = 1 なら、レコードを見せないなどの処理を行います。

logical_delete.sql
UPDATE test SET delete_flag = 1 WHERE id = 123;
search.sql
SELECT user_name FROM test WHERE id = 123 AND delete_flag != 0;

なぜ論理削除を使うのか

論理削除のほうが物理削除より複雑になっています。論理削除では削除をUPDATE文で行うため、直観的ではなくなっていますし、削除したレコードがテーブル内にたまり続けて、ディスク容量を圧迫します。

なぜ論理削除を使うのかという理由としては、削除したレコードを再び使うためです。物理削除にしてしまうとレコードがテーブルから削除されてしまうため、何らかの理由で使用したい場合、データを表示させることが困難です。

一方で論理削除では、レコードがテーブルに残るので、例えばある場面では削除したことにしたいが、他の場面では表示させたいなどの場面に対応することができます。