論理削除について(論理削除が実装できるgem「paranoia」の使用方法)
【結論】
・「論理削除」とは、データベースから対象データを削除せずに、フラグで削除された事を表現する削除方法。データベースから対象データを削除する削除方法は、「物理削除」と呼ばれる。
・データが保持されるので、簡単に復元可能なことがメリット。但しデータ量が増えて、検索速度が落ちる場合もある。
・「paranoia」とは、Railsのgemの一種で、論理削除が簡単に実装できる
【目次】
【本題】
論理削除について
論理削除とは、データベースから対象データを削除せずに、フラグを使って削除された事を表現する削除方法です。
論理削除を行うと、対象データは検索してもヒットしませんが、データベースにデータは保持されたままになります。
なお、データベースから対象データを削除する削除方法は、「物理削除」と呼ばれます。
論理削除のメリット・デメリット
論理削除は実際のデータを保持したまま、見た目上は削除された様に装うことができる事から、下記の様なメリットがあります。
・誤って削除しても、直ぐにデータを復元することができる
・データが消える事によって、データの整合性が取れなくなる事象を防ぐ
しかし、論理削除にもデメリットはあります。
・フラグの付け忘れなどによって、バグの温床となり得る
・データ量が増える為、検索速度が落ちる
それぞれのメリット・デメリットを理解した上で、必要な場面で利用することが重要です。
gem「paranoia」について
Railsの場合、「paranoia」というgemを用いることで、簡単に論理削除を実装することが可能です。
実装の流れですが、まずはgemをインストールします。
gem ‘paranoia'
次に、論理削除したいモデルに deleted_atカラムとindexを追加します。
rails g migration AddDeletedAtToUsers deleted_at:datetime:index
class AddDeletedAtToUsers < ActiveRecord::Migration[5.1] change_table :users, bulk: true do |t| t.column :deleted_at, :datetime t.index :deleted_at end end
そして、対象モデルに acts_as_paranoid を追記します。
class User < ApplicationRecord acts_as_paranoid end
これで実装は完了です。
あと、 destroy を実行すると、deleted_atにタイムスタンプが入り、物理削除ではなく論理削除になります。
user.destroy
また、元に戻す場合は、restoreを実行します。
user.restore
なお、アソシエーションを組んでいる子モデルにdependent: :destroy
を設定していて、子モデルも論理削除を行いたい場合は、子モデルにもカラム追加とモデルにacts_as_paranoidの記述を行う必要があります。
参考情報
GitHub - rubysherpas/paranoia: acts_as_paranoid for Rails 5, 6 and 7
すぐに使える!DBデータの論理削除(1/4) そもそも「論理削除」って何? - DBひとりでできるもん
https://remonote.jp/rails-gem-paranoia