こんにちは!ともおです!
退会機能の論理削除ってなに?物理削除となにが違うの?
私が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_all | where()とあわせて使用し、複数のデータを削除する | 対象データだけでなく、関連するデータも削除する |
delete | データを1件削除する | 関連するデータは削除しない |
delete_all | where()とあわせて使用し、複数のデータを削除する | 関連するデータは削除しない |
よく使うdestroyの使い方を記します。
destroyメソッドは、データを1件削除するメソッドです。
対象データだけでなく、モデルクラスでdependent: :destroyを指定して関連付けたデータも自動的に削除されます。
ユーザーID | 名前 |
1 | ごりら |
2 | きりん |
3 | らいおん |
このようなテーブルの場合でid(2)のきりんを消したい場合は
User.find(2).destroy
と記述することにより簡単に実装できる。
まとめ
自分が調べたなかでまとめてみました。不明点ありましたら改善していきたいので、連絡よろしくお願いします。私の記事が参考になれば幸いです。
それではまた!!
コメント