論理削除について(論理削除が実装できるgem「paranoia」の使用方法)

f:id:ryoutaku_jo:20190617210029p:plain

【結論】

・「論理削除」とは、データベースから対象データを削除せずに、フラグで削除された事を表現する削除方法。データベースから対象データを削除する削除方法は、「物理削除」と呼ばれる。

・データが保持されるので、簡単に復元可能なことがメリット。但しデータ量が増えて、検索速度が落ちる場合もある。

・「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 3, 4 and 5

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

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

【Rails】paranoiaで論理削除を実装する | RemoNote

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

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

《今日の学習進捗(3年以内に10000時間に向けて)》

ここ1〜2週間はサービスリリースの直前の追い込みで、目の前の作業を熟す事に終始していたが、先輩方がタスク整理してガントを引き直して下さったおかげで、逆算してスケジュールを立てることが出来た。

やはり、先を見据えると気持ちの入り方も違うので、改めてタスク管理の重要性を感じた。

なお、先輩方は土日も作業されていた様で頭が下がる・・・先輩方の負担を減らせる様に、任せて頂いたクライアント向けの本番環境構築は上手く進めていきたい。

また、本日は他社コンサル会社のデータベースとの連携の打ち合わせに参加させて頂いた。連携には技術的な課題が多そうで、重要キーワードをキーに顧客に適した情報を提供する構想は非常に面白く、取り組みがいのある内容だった。

重要キーワードの抽出については、「MeCab」で形態素解析した単語を「TF-IDF」で重み付けする方法が上手く行けば、Rubyでも実装出来そうなので、時間を見つけて試してみたい。

但し、この辺りの基礎理論は全く分からないので、業務設計に合わせて柔軟に出力結果をコントロール出来るか不安ではある。時間は掛かるが、統計学や大学数学などの基礎の勉強は地味に行っていきたい。

学習開始からの期間 :192日
今日までの合計時間:1867h
一日あたりの平均学習時間:9.8h
今日までに到達すべき目標時間:1753h
目標との解離:114h
「10,000時間」まで、

残り・・・「8133時間!」