11
6

Railsで考える物理削除と論理削除の使い分け

Last updated at Posted at 2023-12-05

物理削除(Physical Deletion)とは

物理削除は、DBから対象のレコードを完全に削除する方法です。

app/controllers/customers_controller.rb
class CustomersController < ApplicationController
  def destroy
    @customer = Customer.find(params[:id])
    @customer.destroy
    redirect_to customers_path, notice: "顧客情報を削除しました。"
  end
end

論理削除(Logical Deletion)とは

論理削除は、レコードを物理的には削除せずに、削除を表すための方法です。

真偽値でフラグをカラムとして追加することで、フラグによって、削除されたデータは非表示になり、実際にはDBにはレコードとして残されています。

schema.rb
create_table :customers do |t|

  t.boolean :is_deleted, default: false, null: false
  t.timestamps
end
customer.rb
class Customer < ApplicationRecord
  def customer_status
    if is_deleted ? "退会" : "有効"
  end
end

is_deletedというboolean型のカラムにより、論理削除を表し、顧客が退会した場合はis_deletedtrueになる。customer_statusメソッドは、is_deletedtrueの場合は"退会"、falseの場合は"有効"を返す。

コントローラではupdateアクションを使って顧客情報を更新することで、論理削除を制御しています。

customers_controller.rb
class CustomersController < ApplicationController

  def update
    @customer = Customer.find(params[:id])
    if @customer.update(customer_params)
      redirect_to @customer, notice: "顧客情報を更新しました。"
    else
      render :edit
    end
  end

  private

  def customer_params
    params.require(:customer).permit(:is_deleted, :other_columns)
  end
end

論理削除と物理削除の使い分け

あらゆる状況によってどちらが最適かは変わってきますが、今回は顧客情報を例に考慮すべき点をまとめます。

データの復元

顧客がアカウントを誤って削除した場合や、一時的にサービスを停止したい場合など、後でデータを復元する可能性がある場合は、論理削除が適しています。

法的要件

一部の地域や業界では、特定の顧客情報を一定期間保持することが法律で要求されている場合があります。このような場合、論理削除を使用してデータを保持し、必要に応じてアクセスできるようにすることが有効です。

プライバシーとセキュリティ

顧客が自分のデータを完全に削除することを望む場合や、データ漏洩のリスクを最小限に抑える必要がある場合は、物理削除が適しています。

パフォーマンス

DBのパフォーマンスを最適化するために、不要なデータを物理削除することが有効な場合もあります。

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6