2つのテーブルがあると仮定します:users
とorders
。ユーザーには多くの注文があるため、当然、私の注文テーブルには外部キーuser_idがあります。
Rails(速度、スタイル、参照整合性の観点から))で、ユーザーが削除された場合、すべての依存する注文も削除されるようにするためのベストプラクティスは何ですか?次のオプションを検討しています:
ケース1.ユーザーモデルで:dependent => :destroy
を使用する
ケース2. postgresと書き込みでテーブルの順序を定義する
user_id integer REFERENCES users(id) ON DELETE CASCADE
ケース1を使用する理由はありますか?ケース2は私がやりたいことをすべてやっているようです。実行速度に違いはありますか?
それは本当にあなたが望む行動に依存します。ケース1では、関連付けられた各注文でdestroyが呼び出され、そのため ActiveRecordコールバック も呼び出されます。ケース2では、これらのコールバックはトリガーされませんが、はるかに高速になり、参照整合性が保証されます。
アプリケーションの初期段階では、:dependent => :destroy
それは、データベースに依存しない方法で開発できるようにするためです。スケーリングを開始したら、パフォーマンス/整合性の理由からデータベースで実行する必要があります。
has_many :orders, dependent: :destroy
add_foreign_key :orders, :users, on_delete: :cascade
(データベース移行中)
has_many :orders, dependent: :delete_all
私はオプション1を使用します。それは機能するかもしれませんが、オプション2でいくつかの問題を確認できます。
destroy
ハンドラは起動しません確かにオプション2の方が速いと思いますが、トレードオフの価値があるかどうかはあなた次第です。アプリケーションのユーザーの削除は一般的な操作ですか?
別のオプションは、:dependent => :delete_all
を使用することです。これは:dependent => :destroy
よりも高速で、上記の1と2の欠点を回避します。詳細は こちら を参照してください。