コムセント 技術情報

  1. TOP
  2. コムセント 技術情報
  3. データベースにおける論理削除と物理削除について

データベースにおける論理削除と物理削除について

データベースに登録したデータを削除する手段には2種類存在します。
ひとつは「実際には削除せず、フラグによって『削除した』ことを表現する」方法、
もうひとつは「完全にデータベースからデータを除去する」方法です。
前者を「論理削除」、後者を「物理削除」と称します。

それぞれの違いと、どの手法を選択すべきかを考えるために、論理削除・物理削除のメリット・デメリットについて説明します。

論理削除のメリット

論理削除の何よりのメリットは、「実際には削除していない」ということです。
論理削除を実装する方法としては、
・テーブルに「status」といったフラグとなる列を作成し、格納されている値で判定する
・「削除した時間」という項目を用意し、nullであれば生きているデータ、時間が入っているなら消えているデータとして判定する
という方法が挙げられます。

これらはつまり、あくまでシステムによって「削除している」という判定を下しているだけでデータ自体はそのまま残っているということです。
そのため、「間違えて消してしまったデータを復元したい」、「過去のデータを確認したい」といった状況において、非常に役立ちます。
これは、削除機能をユーザーに開放している場合…つまり、「会員」などが存在し、何かしらのデータを登録・削除等を行うようなサイトにおいては、誤操作などの可能性が高まりますので
論理削除を使用する方が良いといえます。
また、すべての処理が記録されたままとなる…つまりログ的な用途も持てますので、「削除したデータも含めて管理画面上で表示したい」といった時にも便利でしょう。
当然物理削除でもログ自体は取るかと思いますが、その場合は「別のログファイルに出力する」「削除データ用のテーブルに移動する」といった方法を取ることが多いです。その場合、テーブル数が増えるなど、別の面で容量が増えますので、容量削減という面で見ても論理削除の方が有利なこともあります。

論理削除のデメリット

データが消えていない、ということはそのままデメリットにも繋がります。
消そうと思っても消えない、前のデータがそのまま残っている、ということは「登録が行われたぶんだけデータベースの容量が増えていく」という事です。
保存するデータの重要さや設計にもよるのですが、あまりにも激しくデータの登録・削除を行うようなシステムであれば、論理削除による容量の膨れ上がりには注意しなければいけません。
特に小さなシステムの運用ならそこまで問題は発生しないのですが、これが大規模サイトの運用となってくると扱うデータ量が非常に多くなりパフォーマンス上の問題が発生します
使用しているフレームワークによっては、クエリを組み立てる上で「削除フラグが立っている場合は表示しない」という処理を自動で入れてくれるため気付きにくいのですが
実際に走る処理では毎回削除フラグのチェック判定を行っているため、データベースが膨らめば膨らむほどチェック判定によるパフォーマンスの低下が顕著になっていきます。

また、データが消えずに残るということは「セキュリティ上での問題」にも繋がります。
例えばサイト自体のプライバシーポリシー等で「データを削除する」と決まっている場合は、それに従う必要があります。

そして前述の通り、論理削除はあくまでシステムによって削除/非削除を制御しているに過ぎません。物理削除であれば「そもそもデータが存在しなくなる」ため問題はありませんが
論理削除の場合、システムに問題があった時「削除したはずのデータが表示されてしまう」といった、重大なインシデントに繋がります。

更に言えば、論理削除は「アンチパターン」と呼ばれることが多くなっています。アンチパターンとはつまり「定番になってはいるが、良くないとされるもの」であり、上記のパフォーマンス面、セキュリティの面からも「使用しているテーブルに不必要なデータを混ぜておくのは如何なものか」という考え方が広まっています。

物理削除のメリット

物理削除のメリットは、ほぼそっくりそのまま論理削除のデメリットの反対となります。
つまり、
「完全にデータが消えるので『消えたデータが出てきてしまう』といった現象が起こり得ない」
「データベース上から消え去るので容量問題が発生しない」
「削除フラグなどを毎回見る必要がないためパフォーマンス上優れている」
という点が大きなメリットとして挙げられます。

また、物理削除はフラグなどを見に行く必要がないため、それらに関連したコードを書く必要がなく、実装する上でも非常に楽な手段です。

物理削除のデメリット

こちらも論理削除のメリットの反対となります。
「一度消したデータはもう復元出来ない」
「過去にどういうデータがあったのか確認できない」
というのはデメリットとして非常に大きいです。
そのため、サイト管理者が操作できる部分のみに適用したり、一度消したら二度と戻せないという事を明記した上で、セキュリティ上すぐさま削除する必要がある部分に適用する…など、使い所には気をつける必要があります。

対策としては、「ログファイルを別に取っておく」というものがあるでしょう。
データベース上からは削除するが、別の箇所にログとして残しておくことで
容量問題や消したデータが表に出てきてしまうような事はなくなり、それでいて、後からどのような登録処理を行ったかを追って確認する事もできるようになります。
また、外部にログファイルを出力するのではなく、データの削除を行う時に専用のテーブルにコピーしてから削除する、という方法もあります。
コピー時に、暗号化をかければデータは残しつつセキュリティ上の対策もできるでしょう。テーブル自体は多くなり、全体の容量としては増えてしまいますが論理削除のようなパフォーマンス・セキュリティ上の問題は少なくなります。

まとめ・結論

これまでに挙げたように、データベースにおけるデータの削除方法として、論理削除と物理削除があります。それぞれにはメリットとデメリットが存在し、どちらを使用するかはサイトの仕組みや状況などによります。

論理削除はデータの復元、過去のデータの確認等ができるというメリットがありますが、データベースの容量や速度、セキュリティ上の問題を考える必要があります。一方で物理削除はデータを完全に消去し、データベースの容量を抑えたり漏洩のリスクを抑えることができますが、一度削除したデータを確認することはできないというデメリットがあります。

どちらを選択するかはサイトの作り方、案件によって変わるはずです。論理削除・物理削除ともに良いところ・悪いところがあり、最適な手段を選択することが大事となるでしょう。

プログラマー/S.Y

PHPフレームワーク「CodeIgniter」を用いたWebサイト開発を専門とする。要件に応じ、WordPressサイトの構築から、JavaScriptを活用した動的なフロントエンド・バックエンドの実装まで、幅広く担当する。

このメンバーの記事一覧へ

おすすめ記事