データベースの論理削除と物理削除
データベースからデータを削除するには、「論理削除」と「物理削除」2種類の方法がありまります。
物理削除とは文字通りDELETE構文を利用しデータベースよりレコードを完全に削除してしまうことをです。
論理削除とは、データベースにフラグとなるフィールドを作成しておき、削除時に削除フラグを立てることにより、仮想的に表示時に見えなくしてしまう処理になります。
私がデータベース設計を行う際には論理削除を採用するのですが、論理削除のメリットデメリットをまとめておきたいと思います。
論理削除のデメリットが、物理削除のメリットになります。
論理削除
メリット
- 誤ってDBからデータが削除された場合に簡単に復元できる
デメリット
- 表示時にWHERE句にフラグの確認が必要になる
- 削除処理をUPDATE構文で行う為、非直感的である
- レコードが肥大し続ける為データベースのコストパフォーマンスを損なう恐れがある。
(一定期間後に削除フラグが付いたデータを削除する時効処理を施せばある程度改善できる) - DB設計が若干複雑になる
- データに個人情報が含まれる場合は、削除データの保持は問題が発生することもある
うーん。
あんまりメリットが見出せなかったが、「削除されたデータの復元」がデメリットを理解したうえで、私が論理削除を採用するに値するメリットになっています。
誤ってDBからデータが削除されるケースとして、「顧客が誤って削除する」と「システムのバグで削除する」のが考えられます。
基本的に論理削除は「顧客が誤って削除する」に対応する為に採用しているのではないです。
(サービスやオプションとして誤って削除したデータの復元を行う場合もあるのですけども)
システムのバグで削除された場合に調査、復元が容易だということで採用しています。
理想はケースバイケース(処理ベースではなく案件ベース)で使い分けるのが良いと思うのですが、他のプログラマーさんはどのように書いてるのでしょう?
ちょっと気になったのでエントリーしてみました。コメントやトラックバック、ソーシャルブックマークでご意見いただけたらうれしいです。