2017-02-16 3 views
5

時々、私はユーザーの電子メールが重複していることに気づきます。一意性をチェックするモデル検証(アプリレベル)でさえも。私はこれが並行性の問題に関係していると考えています。電子メールをダウンケースとして保存する際に問題がありますか?

私はこれに対処するためにdbレベルにインデックスを追加することに決めました。

とにかくインデックスが低いのはおそらく分かりやすいでしょう。

電子メールがアプリケーションレベルで低下していることを保証しても、データベースは一貫性のより強い保証を提供します。

これは決して重要ではないかもしれませんが、DBを強制することで傷つけることもありません。

大文字は決してアプリ側から入力されることはないが、アプリは他のソースからデータベースに入るデータを制御することができず、そのすべてのコード開発者のエラー、メンテナンスコストなどの傾向がある

私も userモデルでこのコードブロックでこのロジックを結合しました
class CreateUniqueIndexForUserEmails < ActiveRecord::Migration 
    def up 
    remove_index :users, :email 

    execute <<-SQL 
     CREATE UNIQUE INDEX index_users_on_lower_email ON users (LOWER(email)); 
    SQL 
    end 

    def down 
    execute <<-SQL 
     DROP INDEX index_users_on_lower_email; 
    SQL 

    add_index :users, :email 
    end 
end 

[email protected]は次のように書き換えますが保証

def email=(value) 
    write_attribute :email, value.downcase 
end 

[email protected](アプリレベル)

ほとんどのケースで、大文字と小文字を区別する電子メールサーバーがあることを示すAre email addresses case sensitive?のポインタから、RFCのオンラインを読んでいます。

今日でも私は電子メールを送信します。私はほとんどケーシングに気を取らない。実際には、電子メールをダウンケースとして出力します。電子メールは引き続き配信されます。

RFCは非常に考慮すべき点ですか?すなわち、ユーザが[email protected]を入力した場合、[email protected]として電子メールが登録されます。これは電子メールの「配信可能性」に影響を及ぼしますか?

そうでない場合は、他にどのような懸念事項を考慮する必要がありますか?

+0

実際の答えではなく、ちょうどハックの提案:「正規化された」電子メール(「normalized_email」のような)を保存するための別の列もありません。まれに、まれに同一のメールアドレスを持つ2人のユーザーがいる場合は、他のメールを使用するか、別の方法でこれを処理するかのどちらかを要求できます。 –

+0

2番目の列を持つことも私が考えている提案です。しかし、この検討の前に、小文字の電子メールに関する提案が推奨されるアプローチであるかどうかを知りたい –

答えて

関連する問題