ソフトデリート(Soft delete)
行を実際には消さず、削除済みの印を付けること。たいていは deleted_at というタイムスタンプを使う。ごみ箱、取り消し、「誰が消したのか」への回答が手に入る。
代償は、以降のあらゆるクエリで支払うことになる。すべての SELECT に WHERE deleted_at IS NULL を付け忘れてはならず、忘れた人のレポートには幽霊が現れる。削除済みの行が値を占有し続けるので、ユニークインデックスも期待どおりに働かない(PostgreSQL では部分ユニークインデックスで回避する)。外部キーは「削除済み」の行を指し続け、テーブルは増える一方だ。
代替策のほうが良いことも多い。行をアーカイブテーブルへ移すか、イベントログに履歴を持たせる方法だ。そして GDPR も忘れずに。ユーザーから忘れてほしいと求められたとき、ソフトデリートは法的な意味での消去にはならない。