2017-02-16 12 views
5

Thỉnh thoảng, tôi nhận thấy email của người dùng bị trùng lặp. Ngay cả với xác thực mô hình (cấp ứng dụng) để kiểm tra tính duy nhất. Tôi nghi ngờ điều này liên quan đến mối quan tâm đồng thời.Bất kỳ vấn đề nào với việc lưu trữ email dưới dạng gói gọn?

Tôi đã quyết định thêm chỉ mục trên cấp db để giải quyết vấn đề này.

Chỉ mục thấp hơn có thể là hợp lý khi có.

Thậm chí nếu chúng tôi đảm bảo rằng email được hạ xuống ở cấp ứng dụng. Cơ sở dữ liệu cung cấp một đảm bảo mạnh mẽ hơn về tính nhất quán.

Nó có thể không bao giờ quan trọng, nhưng có DB thực thi nó cũng không thể làm tổn thương.

Tôi có thể thực hiện nhiều biện pháp bảo vệ để tối đa hóa tỷ lệ cược mà không bao giờ có ký tự viết hoa từ phía ứng dụng nhưng ứng dụng vẫn không thể kiểm soát dữ liệu đi vào db từ các nguồn khác và tất cả mã đó là dễ bị lỗi nhà phát triển, chi phí bảo trì, vv

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 

tôi cũng đã kết hợp logic này với khối mã này trong user mô hình:

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

nào đảm bảo [email protected] được viết lại như [email protected] (ở cấp ứng dụng).

Tôi đã đọc RFC trực tuyến, chủ yếu từ con trỏ tại Are email addresses case sensitive? cho biết một số máy chủ email quan tâm đến độ nhạy của chữ hoa chữ thường.

Thậm chí, khi tôi gửi email ngay hôm nay. Tôi hầu như không để tâm vào vỏ bọc. Trong thực tế, tôi gõ email ra như xuống-cased. Email vẫn được gửi.

RFC có phải là điều đáng xem xét không? tức là Nếu người dùng nhập [email protected], ứng dụng sẽ đăng ký email là [email protected]. Điều này có ảnh hưởng đến email "khả năng phân phối" không?

Nếu không, tôi nên tính đến những mối quan tâm nào khác?

+0

Không phải là câu trả lời thực sự, chỉ là một đề xuất hack: Tại sao không có cột riêng để lưu trữ email "bình thường" (như 'normalized_email') cũng nên là duy nhất? Ý tôi là, trong một số ít trường hợp, khi có trường hợp thực sự quan trọng VÀ có hai người dùng có email giống hệt nhau, bạn có thể yêu cầu một trong số họ sử dụng email khác hoặc xử lý email theo cách khác. –

+0

Có một cột thứ 2 là một gợi ý mà tôi đã xem xét. Nhưng trước khi xem xét điều này, tôi muốn biết liệu đề xuất về email vỏ bọc thấp hơn có phải là phương pháp được đề xuất hay không –

Trả lời

Các vấn đề liên quan