Sử dụng địa chỉ email làm khóa chính?


234

Địa chỉ email có phải là ứng cử viên tồi cho chính khi so sánh với số tự động tăng không?

Ứng dụng web của chúng tôi cần địa chỉ email là duy nhất trong hệ thống. Vì vậy, tôi nghĩ đến việc sử dụng địa chỉ email làm khóa chính. Tuy nhiên, đồng nghiệp của tôi cho rằng so sánh chuỗi sẽ chậm hơn so với so sánh số nguyên.

Đây có phải là một lý do hợp lệ để không sử dụng email làm khóa chính?

Chúng tôi đang sử dụng PostgreSQL.


5
'Chính' nghĩa là gì? Nếu địa chỉ email cần phải là duy nhất thì đó là một khóa và yêu cầu một ràng buộc duy nhất. Cho dù bạn quyết định 'quảng bá' thì đó là 'chính' là tùy ý, trừ khi có một lý do thực tế để làm như vậy, ví dụ như tối ưu hóa một hệ thống hoạt động kém.
onedaywhen

7
Nếu bạn muốn cơ sở dữ liệu của mình thực thi một địa chỉ email duy nhất, thì hãy tạo một cột có chỉ mục duy nhất, nhưng không sử dụng nó làm khóa chính.
James Westgate

104
@robert Nếu ai đó muốn thay đổi địa chỉ email của mình thì sao? Bạn sẽ thay đổi tất cả các khóa ngoại?
systempuntoout

3
@encedaywhen - hầu như không có sự khác biệt nào, nhưng khóa chính sẽ được phân cụm theo mặc định, trong khi một chỉ mục duy nhất sẽ không được. Bạn vẫn sẽ muốn xác định khóa chính sẽ là khóa tra cứu bản ghi đơn mặc định, chỉ mục duy nhất chỉ thực thi tính duy nhất của cột so với chỉ mục bình thường
James Westgate

3
@James Westgate: FYI, không có thứ gọi là phân cụm tự động trong PostgreSQL. Một KEY PRIMARY được triển khai trên đĩa giống hệt như INDEX UNIITE trong đó tất cả các trường KHÔNG phải là NULL.
Matthew Wood

Câu trả lời:


283

So sánh chuỗi chậm hơn so với so sánh int. Tuy nhiên, điều này không quan trọng nếu bạn chỉ cần truy xuất người dùng từ cơ sở dữ liệu bằng địa chỉ email. Không thành vấn đề nếu bạn có các truy vấn phức tạp với nhiều phép nối.

Nếu bạn lưu trữ thông tin về người dùng trong nhiều bảng, các khóa ngoại đối với bảng người dùng sẽ là địa chỉ email. Điều đó có nghĩa là bạn lưu trữ địa chỉ e-mail nhiều lần.


11
@Sjoerd: Vấn đề không phải là địa chỉ email được lưu trữ nhiều lần, mặc dù điều đó chắc chắn không hiệu quả, nhưng ai quan tâm đến dung lượng ổ cứng hiện nay. Hầu hết các doanh nghiệp không có quy mô google, nơi điều này sẽ có vấn đề. Vấn đề là địa chỉ email không thể thay đổi sau đó, vì cả hai đều là khóa chính & được tham chiếu là khóa ngoại.
Stefan Steiger

@StefanSteiger Ai nói gì về dung lượng ổ cứng? Bất cứ điều gì bạn lưu trữ sẽ chiếm không gian trong RAM.
Jonathan Allen

Trong trường hợp bất kỳ ai thắc mắc, như tôi đã làm, khóa GUID sẽ tương đương với khóa email tôi nghĩ.
tofutim

178

Tôi cũng sẽ chỉ ra rằng email là một lựa chọn tồi để tạo ra một lĩnh vực độc đáo, có những người và thậm chí các doanh nghiệp nhỏ chia sẻ một địa chỉ email. Và giống như số điện thoại, email có thể được sử dụng lại. Jsmith@somecompany.com có ​​thể dễ dàng thuộc về John Smith một năm và Julia Smith hai năm sau đó.

Một vấn đề khác với email là chúng thay đổi thường xuyên. Nếu bạn đang tham gia vào các bảng khác với khóa đó, thì bạn sẽ phải cập nhật các bảng khác cũng có thể là một hiệu suất khá cao khi toàn bộ công ty khách hàng thay đổi email của họ (điều mà tôi đã thấy xảy ra.)


47
+1 để đề cập đến vấn đề cập nhật xếp tầng. Đó là lý do tại sao bạn bè cho phép bạn bè chỉ sử dụng khóa thay thế ;-).
sleske

10
à, tôi không thích câu nói nào cả ... khóa thay thế cũng có thể là nguồn gốc của vấn đề; có, ứng dụng sẽ mạnh mẽ hơn để thay đổi các quy tắc kinh doanh và / hoặc toàn vẹn, tuy nhiên thông tin có thể bị mất một chút dễ dàng hơn và danh tính của các hồ sơ trở nên ít rõ ràng hơn. vì vậy tôi sẽ không đề xuất quy tắc ngón tay cái ở đây ...
Unreason

12
@encedaywhen và @jay, chỉ vì bạn nghĩ nó độc đáo không làm cho nó trở nên độc đáo. Và vâng, một người chồng và người vợ có thể là khách hàng khác nhau. Chỉ cần bạn không gặp phải điều này trước khi điều đó không có nghĩa là nó sẽ không xảy ra. Tôi đã gặp phải nó và nó xảy ra, đó là lý do tại sao email không bao giờ được phép được coi là duy nhất cho dù bạn nghĩ nó nên hay không. Đây là loại yêu cầu bạn đẩy lùi vì nó vốn đã sai.
HLGEM

15
@HLGEM: Tôi không muốn tham gia vào một cuộc tranh cãi bất tận, nhưng bạn không thể nói rằng một khóa được đề xuất không phải là duy nhất dựa trên các giả thuyết mà không biết bối cảnh. ví dụ, theo quan điểm của công ty điện thoại, theo định nghĩa, số điện thoại sẽ xác định duy nhất một khách hàng. Vâng, bạn có thể nói, "Nhưng nếu có hai hoặc ba người có thể trả lời khi bạn gọi số đó thì sao?" Nhưng điều này là không liên quan. Theo quan điểm của công ty điện thoại, theo định nghĩa, đây là một khách hàng. (tiếp tục ...)
Jay

14
(tiếp theo) Tương tự như vậy, nếu bạn đang xây dựng một hệ thống chủ yếu liên quan đến liên lạc qua email - có thể là hệ thống gửi thư hoặc hệ thống chuyển tiếp thông báo - thì có thể theo định nghĩa, địa chỉ email sẽ xác định duy nhất một người dùng. Nếu nhiều người chia sẻ địa chỉ email đó, điều đó không liên quan. Họ là một đích tin nhắn duy nhất, do đó, họ là một người dùng duy nhất. "Người dùng" và "khách hàng" không phải là từ đồng nghĩa với "con người cá nhân".
Jay

99

khóa chính phải là duy nhấtkhông đổi

địa chỉ email thay đổi như các mùa. Hữu ích như một khóa phụ để tra cứu, nhưng là một lựa chọn kém cho khóa chính.


17
Một đặc tính của một chìa khóa tốt là cần ổn định nhưng KHÔNG nhất thiết là bất biến.
onedaywhen

5
@encedaywhen: Đúng! Nếu không thì tại sao SQL lại hỗ trợ xếp tầng?
Bill Karwin

18
nếu bạn có sự lựa chọn, hãy tìm các phím không đổi / bất biến; ít làm việc cho bạn xuống đường; chỉ vì SQL hỗ trợ cập nhật xếp tầng không có nghĩa là luôn luôn là một ý tưởng hay!
Steven A. Lowe

7
@Vincent Malgrat: "cập nhật xếp tầng ... phanh bình thường hóa db" - methinks bạn đã hiểu nhầm khái niệm bình thường hóa!
onedaywhen

5
@Vincent Malgrat: cảm ơn vì đã xác nhận rằng bạn thực sự đã hiểu nhầm khái niệm bình thường hóa. "Bạn không nên lặp lại cùng một thông tin trên nhiều hàng" - bạn có thực sự muốn nói "thông tin" không?! Khóa ghép thường sẽ liên quan đến các giá trị được lặp lại trên nhiều hàng. Đối với khóa ngoại, các giá trị được tham chiếu thay vì "lặp lại", sự khác biệt lớn. Một miền một cột có hai giá trị (ví dụ: 'Có' và 'Không') sẽ có cùng giá trị trên nhiều hàng trong bảng tham chiếu nếu nó có ba hàng trở lên. Đây thực sự là những thứ cơ bản!
onedaywhen

64

Nhược điểm của việc sử dụng địa chỉ email làm khóa chính:

  1. Chậm hơn khi làm tham gia.

  2. Bất kỳ bản ghi nào khác có khóa ngoại được đăng bây giờ đều có giá trị lớn hơn, chiếm nhiều dung lượng đĩa hơn. (Với chi phí không gian đĩa ngày nay, đây có lẽ là một vấn đề nhỏ, ngoại trừ mức độ mà bản ghi bây giờ mất nhiều thời gian hơn để đọc. Xem # 1.)

  3. Một địa chỉ email có thể thay đổi, buộc tất cả các bản ghi sử dụng khóa này làm khóa ngoại được cập nhật. Vì địa chỉ email không thay đổi thường xuyên, vấn đề về hiệu suất có thể là nhỏ. Vấn đề lớn hơn là bạn phải đảm bảo cung cấp cho nó. Nếu bạn phải viết mã, đây là công việc nhiều hơn và giới thiệu khả năng lỗi. Nếu công cụ cơ sở dữ liệu của bạn hỗ trợ "trên tầng cập nhật", thì đó là một vấn đề nhỏ.

Ưu điểm của việc sử dụng địa chỉ email làm khóa chính:

  1. Bạn có thể loại bỏ hoàn toàn một số tham gia. Nếu tất cả những gì bạn cần từ "bản ghi chính" là địa chỉ email, thì với một khóa số nguyên trừu tượng, bạn sẽ phải thực hiện một phép nối để lấy nó. Nếu khóa là địa chỉ email, thì bạn đã có nó và việc tham gia là không cần thiết. Điều này có giúp gì cho bạn hay không phụ thuộc vào mức độ thường xuyên xảy ra tình huống này.

  2. Khi bạn đang thực hiện các truy vấn đặc biệt, con người sẽ dễ dàng nhận thấy bản ghi chính nào đang được tham chiếu. Điều này có thể là một trợ giúp lớn khi cố gắng theo dõi các vấn đề dữ liệu.

  3. Bạn gần như chắc chắn sẽ cần một chỉ mục trên địa chỉ email, vì vậy, làm cho nó trở thành khóa chính loại bỏ một chỉ mục, do đó cải thiện hiệu suất của các phần chèn vì giờ đây chúng chỉ có một chỉ mục để cập nhật thay vì hai.

Theo ý kiến ​​khiêm tốn của tôi, đó cũng không phải là một cú hích. Tôi có xu hướng thích sử dụng các phím tự nhiên khi có sẵn một phím thực tế vì chúng chỉ dễ làm việc hơn và các nhược điểm có xu hướng không thực sự quan trọng trong hầu hết các trường hợp.


@Conrad: Mặc dù vậy, anh ta chỉ ra rằng đó không phải là PITA nếu bạn có một công cụ hỗ trợ CẬP NHẬT CASCADE. Đó không phải là vấn đề tại thời điểm đó là khôn ngoan về mã; vấn đề thực sự duy nhất là mức độ mở rộng của bản cập nhật và mức độ rộng của khóa. Địa chỉ email có thể hơi nhiều, nhưng CẬP NHẬT CASCADE cho PK mã quốc gia gồm 2 ký tự không phải là vấn đề lớn.
Matthew Wood

5
@Matthew IMHO vẫn là Pita. Ví dụ, giả sử rằng khi bạn thiết kế bảng quốc gia của mình, chỉ có hai bảng tham chiếu đến nó, không có gì to tát, nhưng theo thời gian, nó đã trở thành 20 bảng, mỗi bảng có hàng trăm nghìn bản ghi. Một số với tài liệu tham khảo một số mà không. Điều này làm cho một lần ghi logic duy nhất kết thúc là hàng chục nghìn lần ghi và nó không thực hiện được tất cả các bảng vì ai đó đã quên một tham chiếu khi thêm bảng. Đây là điều chính xác đã xảy ra với tôi trên bảng mã quốc gia 2 char Tôi không đùa bạn.
Conrad Frix

@Wood & Conrad: Trường hợp xấu nhất là khi không có hỗ trợ DB tích hợp. Sau đó, bạn phải viết mã cho nó cho mỗi bảng với một tham chiếu được đăng và đây chỉ là một nỗi đau và cánh cửa cho các lỗi xuất hiện. Với các tầng, bạn chỉ cần nhớ thêm một mệnh đề trên mỗi bảng, không phải như vậy một vấn đề lớn
Jay

2
Ưu điểm 1 và 3 là tối ưu hóa sớm, lợi thế 2 là một lợi ích rất nhỏ và được khắc phục hoàn toàn bởi bất kỳ công cụ truy vấn tử tế nào.
Tro

4
@Ash: Đây là một sự khác biệt giữa "Optimizatin" và "tối ưu hóa sớm". Nhưng không sao, với cùng một lý do, tất cả những nhược điểm mà tôi thấy bất cứ ai đề cập đến là tối ưu hóa sớm. vậy bạn đã dời nó ở đâu? Đến # 2, tôi thấy việc gõ thêm các phép nối khi cố gắng thực hiện các truy vấn ad hoc là một nỗi đau lớn. Các bản ghi thường có nhiều khóa ngoại, do đó bạn có thể cần một số phép nối để có được dữ liệu dễ hiểu. Nếu bằng "công cụ truy vấn đàng hoàng", bạn có nghĩa là một công cụ tìm ra dữ liệu bạn muốn xem mà không cần bạn nói và điều kỳ diệu là các phép nối cho bạn, tôi muốn xem cách thức hoạt động của nó.
Jay

12

Nó là khá xấu. Giả sử một số nhà cung cấp e-mail đi ra khỏi kinh doanh. Người dùng sau đó sẽ muốn thay đổi e-mail của họ. Nếu bạn đã sử dụng e-mail làm khóa chính, tất cả các khóa ngoại cho người dùng sẽ sao chép e-mail đó, khiến việc thay đổi khá khó khăn ...

... và tôi thậm chí chưa bắt đầu nói về những cân nhắc về hiệu suất.


Làm thế nào để thay đổi địa chỉ email gây ra có sự trùng lặp? Trừ khi người dùng A thay đổi địa chỉ email của mình và sau đó người dùng B thay đổi email của mình giống với giá trị cũ của người dùng A và các cập nhật của bạn không được thực hiện theo trình tự. Từ xa có thể, tôi đoán.
Jay

2
Một tham chiếu khóa ngoài, theo định nghĩa, chứa giá trị của khóa chính của hàng mà nó đề cập đến. Đặt khác nhau, nó nhân đôi giá trị của khóa chính. (Vì vậy, việc sao chép không phải do thay đổi giá trị. Nhưng thay đổi khó hơn do sự trùng lặp này và ràng buộc thực thi nó).
meriton

5
+1 cho dòng "Giả sử một số nhà cung cấp e-mail không hoạt động."
Reddy

Đây không phải là vấn đề. Xếp tầng khóa ngoài tồn tại để giải quyết vấn đề này. Nếu người dùng thay đổi email của họ, thay đổi sẽ xếp tầng cho tất cả các bảng sử dụng nó làm khóa ngoại.
Rafa

1
@rafa, tôi đảm bảo với bạn rằng nếu bạn sử dụng các cập nhật xếp tầng và toàn bộ nhà cung cấp sẽ ngừng hoạt động hoặc thay đổi tên của họ (Yahoo.com trở thành HooYa.com), cơ sở dữ liệu của bạn sẽ bị khóa đối với tất cả người dùng trong nhiều giờ và có thể vài ngày trong khi xếp tầng này thông qua hệ thống. Đây là một vấn đề rất hợp lệ (và một lý do tại sao nên sử dụng cập nhật xếp tầng nếu bạn có bất kỳ lượng dữ liệu đáng kể nào và khóa có thể thay đổi.)
HLGEM

12

Tôi không biết đó có phải là một vấn đề trong thiết lập của bạn không, nhưng tùy thuộc vào RDBMS của bạn, các giá trị của các cột có thể phân biệt chữ hoa chữ thường . Các tài liệu của PostgreSQL nói: „Nếu bạn khai báo một cột là UNIQUE hoặc PRIMARY KEY, chỉ mục được tạo ngầm định là phân biệt chữ hoa chữ thường. Nói cách khác, nếu bạn chấp nhận đầu vào của người dùng cho tìm kiếm trong một bảng có email là khóa chính và người dùng cung cấp "John@Doe.com", bạn sẽ không tìm thấy ra john@doe.com ".


7
Đáng nói trong kết nối này rằng John@Doe.com và john@Doe.com có ​​thể là cùng một hộp thư hoặc có thể là các hộp thư khác nhau và bạn không có cách nào để nói - không có gì trong thông số kỹ thuật để nói liệu phần cục bộ có phải là trường hợp không- nhạy cảm.
tel

Đây là một vấn đề chung hơn với việc thực thi duy nhất các địa chỉ email hơn là liệu chúng có nên được sử dụng làm khóa chính hay không - vấn đề tương tự cũng xảy ra. +1 vì đây vẫn là một điểm rất hữu ích

11

Không ai có vẻ đã đề cập đến một vấn đề có thể xảy ra là địa chỉ email có thể được coi là riêng tư. Nếu địa chỉ email là khóa chính, rất có thể URL của trang hồ sơ sẽ trông giống như vậy ..../Users/my@email.com. Nếu bạn không muốn tiết lộ địa chỉ email của người dùng thì sao? Bạn sẽ phải tìm một số cách khác để xác định người dùng, có thể bằng một giá trị số nguyên duy nhất để tạo URL như thế nào ..../Users/1. Sau đó, cuối cùng bạn sẽ có một giá trị số nguyên duy nhất.


9

cấp độ logic , email là chìa khóa tự nhiên. Ở cấp độ vật lý , do bạn đang sử dụng cơ sở dữ liệu quan hệ, khóa tự nhiên không phù hợp với khóa chính. Lý do chủ yếu là các vấn đề hiệu suất được đề cập bởi những người khác.

Vì lý do đó, thiết kế có thể được điều chỉnh. Khóa tự nhiên trở thành khóa thay thế (UNIQUE, KHÔNG NULL) và bạn sử dụng khóa thay thế / nhân tạo / kỹ thuật làm khóa chính, có thể là tự động tăng trong trường hợp của bạn.

hệ thống hỏi,

Nếu ai đó muốn thay đổi địa chỉ email của mình thì sao? Bạn sẽ thay đổi tất cả các khóa ngoại?

Đó là những gì tầng dành cho.

Một lý do khác để sử dụng khóa thay thế số làm khóa chính có liên quan đến cách lập chỉ mục hoạt động trong nền tảng của bạn. Ví dụ, trong InnoDB của MySQL, tất cả các chỉ mục trong bảng đều có khóa chính được cấp trước cho chúng, vì vậy bạn muốn PK càng nhỏ càng tốt (đối với các tốc độ và kích thước). Cũng liên quan đến điều này, InnoDB nhanh hơn khi khóa chính được lưu theo trình tự và một chuỗi sẽ không giúp ích gì ở đó.

Một điều khác cần xem xét khi sử dụng một chuỗi làm khóa thay thế, đó là sử dụng hàm băm của chuỗi thực tế mà bạn muốn có thể nhanh hơn, bỏ qua những thứ như chữ hoa và chữ thường của một số chữ cái. (Tôi thực sự đã hạ cánh ở đây trong khi tìm kiếm một tài liệu tham khảo để xác nhận những gì tôi vừa nói; vẫn đang tìm kiếm ...)


4

vâng, tốt hơn nếu bạn sử dụng một số nguyên thay thế. bạn cũng có thể đặt cột email của mình dưới dạng ràng buộc duy nhất.

như thế này:

CREATE TABLE myTable(
    id integer primary key,
    email text UNIQUE
);

8
Tại sao nó "tốt hơn"? Bất kỳ lý do hoặc nguồn?
Sjoerd

20
bạn có thể giải thích về điều đó không?
Sjoerd

4

Có, đó là một khóa chính xấu vì người dùng của bạn sẽ muốn cập nhật địa chỉ email của họ.


1
Tôi nghĩ rằng tôi đã chỉ ra rằng bây giờ chúng tôi đã xếp tầng, đây không phải là vấn đề
malhal

3

Một lý do khác tại sao khóa chính số nguyên tốt hơn là khi bạn tham khảo địa chỉ email trong bảng khác nhau. Nếu địa chỉ là một khóa chính thì trong một bảng khác, bạn phải sử dụng nó làm khóa. Vì vậy, bạn lưu trữ địa chỉ email nhiều lần.


3

Tôi không quá quen thuộc với postgres. Khóa chính là một chủ đề lớn. Tôi đã thấy một số câu hỏi và câu trả lời tuyệt vời trên trang web này (stackoverflow.com).

Tôi nghĩ rằng bạn có thể có hiệu suất tốt hơn bằng cách có khóa chính số và sử dụng INDI ĐỘC ĐÁO trên cột email. Email có xu hướng thay đổi về chiều dài và có thể không phù hợp với chỉ số khóa chính.

một số đọc ở đâyở đây.


3

Cá nhân, tôi không sử dụng bất kỳ thông tin nào cho khóa chính khi thiết kế cơ sở dữ liệu, vì rất có thể tôi cần phải thay đổi bất kỳ thông tin nào sau này. Lý do duy nhất mà tôi cung cấp khóa chính là, đó là sự thuận tiện để thực hiện hầu hết các hoạt động SQL từ phía máy khách và sự lựa chọn của tôi luôn luôn là kiểu số nguyên tăng tự động.


2

Đồng nghiệp của bạn là đúng: Sử dụng số nguyên tự động tăng cho khóa chính của bạn.

Bạn có thể triển khai tính duy nhất của email ở cấp ứng dụng hoặc bạn đánh dấu cột địa chỉ email của bạn là duy nhất và thêm một chỉ mục trên cột đó.

Việc thêm trường là duy nhất sẽ khiến bạn chỉ phải so sánh chuỗi khi chèn vào bảng đó chứ không phải khi thực hiện các phép nối và kiểm tra ràng buộc khóa ngoài.

Tất nhiên, bạn phải lưu ý rằng việc thêm bất kỳ ràng buộc nào vào ứng dụng của bạn ở cấp cơ sở dữ liệu có thể khiến ứng dụng của bạn trở nên không linh hoạt. Luôn luôn cân nhắc trước khi bạn thực hiện bất kỳ trường nào "duy nhất" hoặc "không null" chỉ vì ứng dụng của bạn cần nó là duy nhất hoặc không trống.


1
"Luôn luôn xem xét thích hợp trước khi bạn thực hiện yêu cầu x chỉ vì ứng dụng của bạn cần yêu cầu x." - lời khuyên tồi tệ nhất mà tôi đã đọc trong một thời gian khá dài.
onedaywhen

Tôi không bị thuyết phục bởi "lý lẽ" của bạn - trong cuộc sống thực thường sẽ có những tình huống khi một số dữ liệu thiết yếu (ví dụ: số điện thoại) sẽ không có sẵn ngay lập tức. Nếu một trường như vậy được đánh dấu là KHÔNG NULL trong cơ sở dữ liệu, nó sẽ yêu cầu người dùng làm ô nhiễm dữ liệu bằng các trường giả (như 123) thay vì để trống. Sẽ thực tế hơn khi để ứng dụng xử lý các ràng buộc (và trong trường hợp này, ứng dụng có thể gắn cờ một trường trống dưới dạng một mục hành động).
jrharshath

5
Tôi đồng ý rằng việc xác định một trường "không null" nên được thực hiện thận trọng. Các yêu cầu như "chúng tôi luôn cần số điện thoại của khách hàng" cần được xem xét cẩn thận. Có thể đôi khi bạn không muốn tạo một hồ sơ khách hàng mặc dù chúng tôi không biết số điện thoại ngay bây giờ và quay lại và lấy lại sau? Nhưng "lĩnh vực này phải là duy nhất" là một danh mục khác. Tôi không thể tưởng tượng được rằng "Không sao khi hai nhân viên có cùng số an sinh xã hội, chúng tôi sẽ tìm ra sau." Làm thế nào bạn sẽ bao giờ thẳng ra dữ liệu?
Jay

1
Hãy là Wolves: Tôi biết một người phụ nữ đã không có số điện thoại của riêng mình. Sau đó bạn làm gì?
David Thornley

@DavidThornley Âm thanh như bạn nên làm việc nhiều hơn, hoặc có thể thích nghi với thái độ thân thiện hơn.
Philip Schiff

2

Sử dụng GUID làm khóa chính ... theo cách đó bạn có thể tạo nó từ chương trình của mình khi bạn thực hiện INSERT và bạn không cần phải nhận phản hồi từ máy chủ để tìm hiểu khóa chính là gì. Nó cũng sẽ là các bảng và cơ sở dữ liệu duy nhất và bạn không phải lo lắng về những gì sẽ xảy ra nếu bạn cắt bớt bảng một ngày nào đó và việc tăng tự động được đặt lại thành 1.


2
Trừ khi bạn quan tâm rất ít đến không có gì về hiệu suất, sau đó sử dụng GUID. Sẽ là không-không # 1 nếu bạn đang xây dựng một hệ thống sẽ cần mở rộng quy mô
Micah


3
Nói theo kiểu uống Microsoft-Kool-Aid thực sự!
Gary Chambers

2

Tôi biết đây là một mục nhập muộn nhưng tôi muốn thêm rằng mọi người từ bỏ tài khoản email và nhà cung cấp dịch vụ khôi phục địa chỉ cho phép người khác sử dụng nó.

Như @HLGEM đã chỉ ra "Jsmith@somecompany.com có ​​thể dễ dàng thuộc về John Smith một năm và Julia Smith hai năm sau đó." trong trường hợp này John Smith muốn dịch vụ của bạn, bạn phải từ chối sử dụng địa chỉ email của anh ấy hoặc xóa tất cả các hồ sơ liên quan đến Julia Smith.

Nếu bạn phải xóa hồ sơ và chúng liên quan đến lịch sử tài chính của doanh nghiệp tùy thuộc vào luật địa phương, bạn có thể thấy mình trong nước nóng.

Vì vậy, tôi sẽ không bao giờ sử dụng dữ liệu như địa chỉ email, biển số, v.v. làm khóa chính bởi vì dù chúng có vẻ độc đáo đến mức nào ngoài tầm kiểm soát của bạn và có thể cung cấp một số thách thức thú vị mà bạn có thể không có thời gian để giải quyết.


2

Bạn có thể cần phải xem xét bất kỳ pháp luật quy định dữ liệu áp dụng. Email là thông tin cá nhân và nếu người dùng của bạn là công dân EU chẳng hạn thì theo GDPR, họ có thể hướng dẫn bạn xóa thông tin của họ khỏi hồ sơ của bạn (hãy nhớ điều này áp dụng cho dù bạn ở quốc gia nào).

Nếu bạn cần giữ bản ghi trong cơ sở dữ liệu vì tính toàn vẹn tham chiếu hoặc lý do lịch sử như kiểm toán, sử dụng khóa thay thế sẽ cho phép bạn chỉ NULL tất cả trường dữ liệu cá nhân. Điều này rõ ràng là không dễ dàng nếu dữ liệu cá nhân của họ là khóa chính


1

bạn có thể tăng hiệu suất bằng cách sử dụng khóa chính số nguyên.


1

bạn nên sử dụng khóa chính số nguyên. nếu bạn cần cột email là duy nhất, tại sao bạn không chỉ cần đặt một chỉ mục duy nhất trên cột đó?


1

Nếu bạn có một giá trị không phải là khóa chính thì việc chèn và truy xuất sẽ rất chậm trên dữ liệu lớn.


1
Không, chèn nó sẽ chậm hơn , bởi vì bạn cần hai chỉ mục duy nhất: một trên khóa chính được tạo và một chỉ mục khác trên địa chỉ email.
a_horse_with_no_name

1

khóa chính nên được chọn một thuộc tính tĩnh. Vì địa chỉ email không tĩnh và có thể được chia sẻ bởi nhiều ứng viên nên không nên sử dụng chúng làm khóa chính. Ngoài ra, địa chỉ email là các chuỗi thường có độ dài nhất định có thể lớn hơn id duy nhất mà chúng tôi muốn sử dụng [len (email_address)> len (unique_id)] ​​vì vậy sẽ cần nhiều không gian hơn và thậm chí tệ nhất là chúng được lưu trữ nhiều lần dưới dạng khóa ngoại . Và do đó nó sẽ dẫn đến giảm hiệu suất.


0

Nó phụ thuộc vào bảng. Nếu các hàng trong bảng của bạn đại diện cho địa chỉ email, thì email là ID tốt nhất. Nếu không, thì email không phải là một ID tốt.


0

Nếu đó đơn giản chỉ là vấn đề yêu cầu email là duy nhất thì bạn có thể tạo một chỉ mục duy nhất với cột đó.


0

Email là một ứng cử viên chỉ mục duy nhất tốt, nhưng không phải cho khóa chính, nếu đó là khóa chính, bạn sẽ không thể thay đổi địa chỉ email của liên hệ chẳng hạn. Tôi nghĩ rằng các truy vấn tham gia của bạn cũng sẽ chậm hơn.


0

không sử dụng địa chỉ email làm khóa chính, giữ email là duy nhất nhưng không sử dụng nó làm khóa chính, sử dụng id người dùng hoặc tên người dùng làm khóa chính

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.