論理削除について(論理削除が実装できる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

論理削除と物理削除とは - Qiita

すぐに使える!DBデータの論理削除(1/4) そもそも「論理削除」って何? - DBひとりでできるもん

https://remonote.jp/rails-gem-paranoia

Railsで論理削除を実装したい時は「paranoia」Gemを使おう! - とんてき

【Ruby on Rails】deleted_at を使って論理削除をしよう - きゃまなかのブログ