🚯

【Rails】物理削除 vs 論理削除

2023/07/22に公開

物理削除(Physical Deletion)とは

物理削除は、データベースから対象のデータを完全に削除する方法。
削除されたデータはデータベースから完全に消去され、元に戻すことができない。物理削除はデータベースの容量を減らすことができるため、一部のデータが不要となった場合には有効的。

  • 具体例:ウェブアプリケーションのユーザーデータの場合
    物理削除すると、退会したユーザーのアカウント情報が完全にデータベースから削除される。その結果、退会したユーザーの情報はデータベース上に存在しなくなる。

  • コード例:

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)とは

論理削除は、データベース内のデータを物理的には削除せずに、削除を表すための方法。 削除を表すためのフラグ(例えば、真偽値でtruefalseなど)をデータベースのテーブル追加する。このフラグによって、削除されたデータは非表示になり、ユーザーには見えなくなるが、実際にはデータベースに保管されたままとなる。

  • 具体例:ウェブアプリケーションのユーザーデータの場合
    論理削除をする場合、退会したユーザーのアカウント情報は削除フラグを立てることで、一般ユーザーからは非表示となるが、データベース上には存在し続ける。管理画面などで復元操作をすることで、退会後のユーザー情報を再度表示することができる。

論理削除は、データの誤削除を防止する、データの履歴を保持する、個人情報の取り扱いに対応するなどの目的で使われることがある。

  • コード例:
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 == true
      "退会"
    else
      "有効"
    end
  end
end

このModelでは、is_deletedというboolean型のフィールドがある。これは論理削除を表し、顧客が退会した場合はis_deletedがtrueになる。customer_statusメソッドは、is_deletedがtrueの場合は"退会"、falseの場合は"有効"を返す。

customers/xxx.html.erb
<%= form_with(model: @customer, local: true) do |f| %>
  <!-- 他のフォームフィールドは省略 -->

  <%= f.radio_button :is_deleted, :false %>
  <%= f.label :is_deleted, "有効", value: :false %>

  <%= f.radio_button :is_deleted, :true %>
  <%= f.label :is_deleted, "退会", value: :true %>

  <%= f.submit %>
<% end %>

このViewでは、フォームを使ってis_deletedフィールドを編集できるようにしている。radio_buttonを使用して、"有効"と"退会"の2つのラジオボタンを作成し、顧客のステータスを選択できる。

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_fields)
  end
end

このControllerでは、updateアクションを使って顧客情報を更新している。customer_paramsメソッドで許可されたパラメータを指定し、is_deletedフィールドを更新できるようにしている。

まとめ

データの重要性が低く、復元や削除履歴が必要ない場合は物理削除を使い、重要なデータや復元が必要な場合は論理削除を使う!


チーム開発、いよいよデザインの実装に入りました!みんなでイメージを話し、デザインを整えていくのはとても楽しい♪

Discussion