物理削除(Physical Deletion)とは
物理削除
は、DBから対象のレコードを完全に削除する方法です。
class CustomersController < ApplicationController
def destroy
@customer = Customer.find(params[:id])
@customer.destroy
redirect_to customers_path, notice: "顧客情報を削除しました。"
end
end
論理削除(Logical Deletion)とは
論理削除
は、レコードを物理的には削除せずに、削除を表すための方法です。
真偽値でフラグをカラムとして追加することで、フラグによって、削除されたデータは非表示になり、実際にはDBにはレコードとして残されています。
create_table :customers do |t|
t.boolean :is_deleted, default: false, null: false
t.timestamps
end
class Customer < ApplicationRecord
def customer_status
if is_deleted ? "退会" : "有効"
end
end
is_deleted
というboolean
型のカラムにより、論理削除を表し、顧客が退会した場合はis_deleted
がtrue
になる。customer_status
メソッドは、is_deleted
がtrue
の場合は"退会"、false
の場合は"有効"を返す。
コントローラではupdate
アクションを使って顧客情報を更新することで、論理削除を制御しています。
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のパフォーマンスを最適化するために、不要なデータを物理削除
することが有効な場合もあります。