2

一意性の検証について質問があります。

から: http://guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness

「データベースに一意性制約を作成しないため、2 つの異なるデータベース接続によって、一意にする予定の列に同じ値を持つ 2 つのレコードが作成されることがあります。それを回避するには、一意のインデックスを作成する必要があります。データベース。」

一意性を検証するたびに、データベースにインデックスを追加する必要があるということですか? それとも、2 つのレコードが同時に挿入される可能性が高い場合にのみ必要ですか?

ここでのベスト プラクティスは?

4

1 に答える 1

3

これは本質的に競合状態です。アリスはメール アドレス alice@gmail.com でサインアップし、送信ボタンを 2 回押します。彼女はそれらを非常にすばやくヒットしたため、メモリ内にあるのはそれらだけであり、検証に合格しました。次に、両方がデータベースに書き込まれます。これに対する解決策は、データベースがメモリに格納されるか、データベースに書き込まれる間に一意性もチェックするように要求することです。

あなたがする必要があるのは、移行に次のような行を追加することです:

add_index :table_name, :column_name, unique: true

ベスト プラクティスに関しては、同じものが 2 つあると問題が発生する場合は、必ず実行する必要があります。同じ内容のツイートが 2 つ投稿されても大した問題ではないかもしれませんが、同じメール アドレスを持つユーザーが 2 人いると問題になります。

于 2012-09-14T15:01:51.550 に答える