Laravelでは論理削除(SoftDelete)が割と簡単に実装できる。
しかし、いざ実装しようと思ったら注意 or 検討すべき点がいくつかあったのでメモ。
Cascade
物理削除(完全削除)の場合、cascadeを設定しておけば、削除したレコードに紐づいているテーブルのレコードも一緒に消えてくれる。しかし論理削除の場合は消えてくれない。
もし紐づいてるテーブルのレコードも一緒に論理削除したい場合は、laravel-soft-cascadeというパッケージを使用する必要等がある。詳しくは以下記事様が解説してくださってます。
メールアドレス等のunique制約
例えば会員のメールアドレスにunique制約を設定してある場合。
アカウント削除を行っても論理削除であればデータ自体は残ってるので、
その会員が後日、同じメールアドレスで改めて新規登録しようとしても重複でエラーになってしまう。
→この問題に関しては「複合ユニーク制約」を使用すると解決できる。
詳しくは以下記事様が解説してくださってます。
本当に採用すべきか
論理削除の実装が比較的簡単とは言え、物理削除に比べれば当然処理は複雑になる。データ量もその分多くなる。
そもそも論理削除がどういった場合に必要なのかを改めて考えてみる。
例えばユーザーが自らアカウント削除を行った場合。
これに関してはアカウント削除の画面で「投稿した作品なども自動削除され復元不可」である旨を書いて了承を得るなどすれば問題なさそう(アカウント乗っ取り等も考慮に入れるのであればまた別)。
問題になりそうなのは管理者側の操作ミス。例えば、規約に違反したユーザーや記事などを管理者権限で削除しようとした際に、誤って別のユーザーや記事を削除してしまった場合。こういったケースについては論理削除が有ったほうが保険にはなる。しかし運用面や管理者操作のUIへの工夫などでミスを回避できないか、データベースのバックアップを毎日取ってあるのであれば、物理削除の場合でも最悪1日前のデータであれば復元はできるので、それで何とかならないか。
そのあたり含めてサイトの要件に合わせメリット・デメリットを比較してからどちらにするか決める。
論理削除のメリット・デメリットについては、以下記事様がわかりやすく解説してくださってます。
また、「削除用テーブルにINSERTする」という代替案もあげられてますね。