Trong loại dữ liệu nào tôi nên lưu trữ một địa chỉ email trong cơ sở dữ liệu?


44

Tôi hiểu rằng một địa chỉ email 254 ký tự là hợp lệ, nhưng các triển khai tôi đã nghiên cứu có xu hướng sử dụng một varchar (60) đến varchar (80) hoặc tương đương. Ví dụ: đề xuất Máy chủ SQL này sử dụng varchar (80) hoặc ví dụ Oracle này

Có một lý do để không sử dụng tối đa 254 ký tự? Không phải là một varchar theo định nghĩa chỉ sử dụng nhiều dung lượng cần thiết để giữ dữ liệu?

Có ý nghĩa / đánh đổi hiệu suất đáng kể nào gây ra quá nhiều triển khai để sử dụng ít hơn toàn bộ 254 ký tự có thể không?

Câu trả lời:


45

Tôi đã luôn luôn sử dụng VARCHAR(320). Đây là lý do tại sao. Tiêu chuẩn ra lệnh cho những hạn chế sau:

  • 64 ký tự cho "phần cục bộ" (tên người dùng).
  • 1 ký tự cho @biểu tượng.
  • 255 ký tự cho tên miền.

Bây giờ, một số người sẽ nói rằng bạn cần hỗ trợ nhiều hơn thế. Một số người cũng sẽ nói rằng bạn cần hỗ trợ Unicode cho tên miền (có nghĩa là bạn phải chuyển sang NVARCHAR). Mặc dù tiêu chuẩn có thể thay đổi trong thời gian này (đã được một thời gian kể từ khi tôi có giao diện trong trò chơi), tôi khá tự tin rằng tại thời điểm này, hầu hết các máy chủ trên thế giới sẽ không chấp nhận địa chỉ email Unicode và tôi chắc chắn nhiều máy chủ sẽ gặp sự cố khi tạo và / hoặc chấp nhận địa chỉ có> 320 ký tự.

Điều đó nói rằng, bạn có thể chuẩn bị cho điều tồi tệ nhất bây giờ, nếu bạn thích (và nếu bạn đang sử dụng Nén dữ liệu trong SQL Server 2008 R2 hoặc tốt hơn, bạn sẽ được hưởng lợi từ nén Unicode, nghĩa là bạn chỉ phải trả tiền phạt 2 byte cho các ký tự thực sự cần nó). Bằng cách này, bạn có thể làm cho cột của mình rộng như bạn muốn và bạn có thể cho phép mọi người nhét bất kỳ thứ rác nào quá dài vào đó mà họ muốn - họ sẽ không nhận được e-mail nếu họ đưa cho bạn rác giống như họ sẽ không nhận e-mail nếu chèn thất bại. Vấn đề là nếu bạn để rác không hợp lệ, bạnphải đối phó với nó Và bất kể kích thước của bạn là bao nhiêu - nếu ai đó sẽ cố nhét 400 ký tự vào cột 320 ký tự, ai đó sẽ cố nhét 1025 ký tự vào cột 1024 ký tự. Không có lý do bất kỳ người nhạy cảm nào nên có địa chỉ email> 320 ký tự trừ khi họ đang sử dụng nó để kiểm tra ranh giới hệ thống một cách rõ ràng.

Nhưng hãy ngừng hỏi ý kiến về vấn đề này - và ngừng xem các triển khai khác để được hướng dẫn (điều này chỉ xảy ra trong trường hợp này mà những người bạn tham khảo đã không bận tâm làm bài tập về nhà của họ và chỉ chọn số trong số họ, bạn biết đấy) . Bạn có quyền truy cập trực tiếp vào tiêu chuẩn - đảm bảo bạn tham khảo phiên bản mới nhất, hỗ trợ ở mức tối thiểu và luôn ở trên tiêu chuẩn để bạn có thể thích ứng với các thay đổi trong thông số kỹ thuật.


EDIT cảm ơn @ypercube cho ping trong trò chuyện.

Ở một bên, có lẽ bạn không muốn đổ toàn bộ địa chỉ vào một cột ở vị trí đầu tiên. Bình thường hóa có thể gợi ý rằng bạn không muốn lưu trữ @hotmail.com15 triệu lần khi một FK int nhiều da hơn sẽ hoạt động tốt và không có chi phí bổ sung của các cột có chiều dài thay đổi. Bạn cũng có thể bình thường hóa tên người dùng, john.smith@hotmail.comjohn.smith@gmail.comchia sẻ tên người dùng chung - họ không biết nhau nhưng cơ sở dữ liệu của bạn không quan tâm đến điều đó.

Tôi đã nói về một số điều này ở đây:

http://www.mssqltips.com/sqlservertip/2657/storing-email-addresses-more- hiệu quả-in-sql-server /

http://www.mssqltips.com/sqlservertip/2671/storing-email-addresses-more-fficly-in-sql-server--part-2/

Tuy nhiên, điều này đưa ra những thách thức đối với giới hạn 254 ký tự ở trên, vì dường như không có sự đồng thuận về những gì xảy ra khi miền 255 ký tự hợp lệ được kết hợp với một cục bộ 1 ký tự hợp lệ. Điều này nên được chấp nhận bởi hầu hết các máy chủ trên toàn thế giới nhưng dường như vi phạm giới hạn 254 ký tự này. Vì vậy, bạn có tạo một Domainsbảng có giới hạn thấp hơn một cách giả tạo về độ dài cho các địa chỉ email, khi tên miền có thể được sử dụng lại làm URL 255 ký tự hợp lệ không?


Tôi thích cách tiếp cận này nhưng những gì về tính độc đáo của email? Nó được quản lý như thế nào?
Roberto Rizzi

2
@RobertoRizzi Một ràng buộc hoặc khóa chính duy nhất về sự kết hợp của DomainID + LocalPart hoặc ngược lại.
Aaron Bertrand

5

Có một vài cân nhắc với quyết định này. Đầu tiên và quan trọng nhất là sử dụng các dự đoán hiện tại và tương lai về các hạn chế cần thiết mà dữ liệu sẽ phải tuân thủ. Có một lý do tại sao bạn không muốn đặt mọi loại dữ liệu cột chuỗi varchar(1024)khi bạn chỉ lưu trữ một chuỗi không vượt quá 32 ký tự (nhấn mạnh vào từ khóa nên ).

Nếu bạn có một số lỗ hổng trong đó tất cả các email được sửa đổi thành 255 ký tự, thì bạn có khả năng có thể có tác động hiệu suất lâu dài của việc chia trang. Điều này có vẻ không bình thường, và rất có thể là như vậy, nhưng bạn cần phải định cỡ dữ liệu của mình theo yêu cầu kinh doanh . Giống như các ràng buộc lâu đời tại cơ sở dữ liệu so với tranh luận về ứng dụng, tôi là một người tin tưởng vững chắc rằng các giới hạn loại dữ liệu và các giá trị cho phép cũng nên được thi hành ở tầng dữ liệu.

Dẫn tôi đến điểm tiếp theo của tôi. Cơ sở dữ liệu rất có thể chỉ là tầng dữ liệu. Tầng ứng dụng sử dụng cái gì? Chẳng hạn, nếu bạn có một ứng dụng mà bạn chỉ có thể nhập 80 ký tự cho một địa chỉ email, tại sao bạn muốn loại dữ liệu lớn hơn? Doanh nghiệp cần trả lời hai câu hỏi:

  1. có thể là gì?
  2. nên là gì?

Chỉ sau đó bạn sẽ có câu trả lời của bạn.

Không phải là một varchar theo định nghĩa chỉ sử dụng nhiều dung lượng cần thiết để giữ dữ liệu?

Có và không. Sẽ có một loại bù cho dữ liệu độ dài thay đổi để ghi lại độ dài của nó.


3

RFC 5321 (thông số kỹ thuật SMTP hiện tại, lỗi thời RFC2821):

Tổng chiều dài tối đa của tên người dùng hoặc phần cục bộ khác là 64 octet. Tổng chiều dài tối đa của một tên miền hoặc số là 255 octet

Vì vậy, dấu 64 + 255 + @ ngụ ý VARCHAR (320). Bạn có thể sẽ không bao giờ cần nhiều như vậy nhưng nó an toàn để có nó, chỉ trong trường hợp.



1

Bất kỳ biến thể nào của VARCHAR chỉ sử dụng nhiều không gian trong khối dữ liệu khi cần. Các byte bổ sung để lưu trữ độ dài là không đáng kể so với không gian sẽ bị lãng phí khi sử dụng CHAR có độ dài cố định thay thế.

Vì độ dài cột VARCHAR thực sự là "độ dài tối đa", nên nó phải được đặt lớn hơn độ dài tối đa có thể trong mọi trường hợp. Chỉ có nhiều không gian như mỗi hàng cần sử dụng. Các chương trình ứng dụng sau đó nên được thiết kế với các trường cuộn hoặc bất cứ điều gì có ý nghĩa dựa trên các giá trị điển hình.

Một thiết kế cơ sở dữ liệu giống như một mảnh giấy vật lý ở chỗ nó đặt ra các giới hạn cứng về kích thước. Một trang giấy không thể được mở rộng. Trong sự tương tự này, chương trình ứng dụng giống như một hình thức được in trên trang. Có rất nhiều thứ có thể được thực hiện để điều chỉnh lượng dữ liệu chúng ta có thể giữ trong biểu mẫu.

Mặc dù lệnh tăng kích thước VARCHAR có thể trông đơn giản và chạy ngay lập tức trên một bảng nhỏ, nhưng thực hiện trên một bảng có hàng nghìn hàng trở lên có thể sẽ yêu cầu một số loại cơ sở dữ liệu trong khi tạo lại tất cả các khối dữ liệu và chỉ mục. Một cách là sao chép mọi thứ vào một bảng mới với các cột lớn hơn. Dù sử dụng kỹ thuật nào thì đó cũng là một thỏa thuận lớn. Vì vậy, bạn nên xem xét kích thước cột VARCHAR phần lớn không thay đổi khi bảng sản xuất được tải.


1

Như một bình luận cho các câu trả lời tuyệt vời đã có ở đây:

Đầu tiên, nếu bạn đã tạo trường như sau varchar(240)và bạn muốn thay đổi nó thành trường dài hơn, giả sử varchar(320), thay đổi này sẽ là một hoạt động tầm thường trên máy chủ cơ sở dữ liệu - tất nhiên, tùy thuộc vào sản phẩm cơ sở dữ liệu của bạn.

alter table Schema.Object alter column EmailAddress varchar(320) ;

Thứ hai, tùy thuộc vào kích thước hàng trung bình và kích thước trang, sử dụng varchar(320)thay vì varchar(240)có thể không thay đổi số lượng trang được phân bổ (không gian đĩa thực sự được chiếm bởi bảng).

Thứ ba, ai đó ở trên đã nói về việc xác nhận một địa chỉ email. Tôi cho rằng chỉ có một cách chắc chắn để xác thực địa chỉ email và đó là gửi email đến địa chỉ đó. :-)


0

VARCHAR là loại dữ liệu tốt nhất được sử dụng cho các địa chỉ email vì Email thay đổi rất nhiều theo độ dài. NVARCHAR cũng là một giải pháp thay thế nhưng tôi chỉ khuyên bạn nên sử dụng nếu địa chỉ email có chứa các ký tự mở rộng và hãy nhớ rằng nó yêu cầu dung lượng lưu trữ gấp đôi so với VARCHAR.

Trong môi trường của tôi, chúng tôi sử dụng varchar (70) là những cái dài nhất mà tôi đã gặp là gần 60-70 char, nhưng nó cũng phụ thuộc vào cơ sở khách hàng của công ty bạn. Ngoài ra, như một lưu ý phụ, hãy đảm bảo rằng bạn có một số kiểm tra xác thực Email tại chỗ để xác thực tính hợp lệ của các địa chỉ Email .. như sử dụng các ràng buộc kiểm tra hoặc CHARINDEX


0

Sử dụng SQL DOMAIN

Nếu bạn đang sử dụng máy chủ Cơ sở dữ liệu doanh nghiệp, sẽ có cách nào đó để lưu trữ địa chỉ email dưới dạng DOMAINvới một mức độ hợp lệ nào đó. Tên miền được chỉ định trong đặc tả SQL

Tên miền là một đối tượng do người dùng định nghĩa có thể được chỉ định thay thế cho loại dữ liệu ở một số nơi nhất định có thể chỉ định loại dữ liệu. Một miền bao gồm một loại dữ liệu, có thể là một tùy chọn mặc định và các ràng buộc bằng không hoặc nhiều hơn (miền).

Chẳng hạn, PostgreQuery mã nguồn mở và miễn phí hỗ trợ điều này, loại bỏ mọi hạn chế trong việc triển khai thông số kỹ thuật của bạn, chính cột chứa một email hợp lệ. Bạn có thể ví dụ ..

  • Tạo một tùy chỉnh DOMAINqua thông số HTML5 của email.
  • Hoặc, qua thông số email RFC822, RFC2822, RFC5322.
  • Tạo một tùy chỉnh DOMAINđể kiểm tra máy chủ cho bản ghi MX tại thời điểm kiểm tra.

Tôi đánh giá các tùy chọn này trong câu trả lời này dành riêng cho PostgreSQL

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.