論理削除、物理削除とは?[ruby on rails]

ruby on rails

こんにちは!ともおです!

退会機能の論理削除ってなに?物理削除となにが違うの?

私がrailsを学ぶにあたって退会機能を実装する際に論理削除か物理削除がよくわからなかったので

論理削除と物理削除に関してのまとめを書きます。

参考になれば幸いです!


スポンサーリンク

論理削除とは?

テーブルに削除フラグを項目として用意し、そのTRUE/FALSEで削除をされたかどうか管理する方法のことを指します。実際には、データは削除されておらず、削除フラグによりユーザーには削除しているかのように振舞うことができます。

基本的には、削除フラグにはデフォルトでFALSEを持たせておき、削除されたらそのレコードの削除フラグをTRUEにします。
つまり、通常データ抽出する際は必ず削除フラグがFALSEのものだけを対象とします。

具体例は後に記述します!

物理削除とは?

SQLでDELETE文を発行してレコードを削除することを指します。
原則として容易にデータの復活はできません。

論理削除、物理削除のメリット、デメリット

論理削除のメリット

  • 削除したかのように振る舞うだけなのですぐにデータの復元を実現が可能となる。
  • ユーザが間違えて削除した場合に元に(バックアップからなどの手間をかけずに)戻せる。

論理削除のデメリット

  • 消してもデータが実質減らないのでストレージを圧迫する可能性がある。それに伴い検索性能の劣化に繋がる可能性がある。
  • 削除のアクションがUPDATEになるため直観的に理解しづらい。
  • 論理削除されてる事を前提にアプリを作るとデータが複雑に絡み合うので、実装難易度が上がる。また、実装難易度が上がることによりバグの原因にもつながる。

物理削除メリット

  • 削除=DELETE文発行であるため、実装しやすい。
  • レコードが削除される為、ストレージを圧迫しにくくなる。

物理削除のデメリット

  • 容易に復元したり削除されたデータを参照することができない。

実例

論理削除

is_deletedカラムを作成し、デフォルトをfalseにしておきます。
退会ユーザーのis_deletedをtrueにすることで退会ユーザーのデータは残したまま、退会しているかどうかを区別できるようにします。

今回はユーザーテーブルで退会機能を実装する体で考えます。

   usersテーブル名前(user_name)論理削除フラグ is_deleted
1ごりらfalse
2きりんfalse
3らいおんtrue

論理削除されたデータは、システムの利用者から見ると「存在しない」ことにするのが一般的です。
例えば、ユーザーがシステムの画面からユーザーの一覧を確認する場合、発行されるSQLは以下のようになります。

SELECT user_name
FROM users
WHERE is_deleted = FALSE

検索条件に論理削除フラグをFALSEにすることで、論理削除されたデータ(is_deleted=TRUE)は表示されなくなります。

物理削除

データベース(テーブル)からデータを削除する方法は主に4つあります。

メソッド説明関連データの削除
destroyデータを1件削除する対象データだけでなく、関連するデータも削除する
destroy_allwhere()とあわせて使用し、複数のデータを削除する対象データだけでなく、関連するデータも削除する
deleteデータを1件削除する関連するデータは削除しない
delete_allwhere()とあわせて使用し、複数のデータを削除する関連するデータは削除しない

よく使うdestroyの使い方を記します。

destroyメソッドは、データを1件削除するメソッドです。

対象データだけでなく、モデルクラスでdependent: :destroyを指定して関連付けたデータも自動的に削除されます。

ユーザーID名前
1ごりら
2きりん
3らいおん

このようなテーブルの場合でid(2)のきりんを消したい場合は

User.find(2).destroy

と記述することにより簡単に実装できる。

まとめ

自分が調べたなかでまとめてみました。不明点ありましたら改善していきたいので、連絡よろしくお願いします。私の記事が参考になれば幸いです。

それではまた!!

コメント

タイトルとURLをコピーしました