Địa chỉ email duy nhất hoặc khóa chính?


11

Tôi là một người mới trong cơ sở dữ liệu. Tôi đọc xung quanh và phát hiện ra rằng có lẽ không nên sử dụng địa chỉ email làm khóa chính vì việc so sánh chuỗi chậm hơn sẽ ảnh hưởng đến hiệu suất trong các phép nối phức tạp và nếu một email thay đổi tôi sẽ phải thay đổi tất cả các khóa ngoại yêu cầu rất nhiều của nỗ lực.

Nhưng nếu bảng người dùng của tôi yêu cầu mỗi người dùng phải có một địa chỉ email và mỗi địa chỉ email đó phải là duy nhất, liệu việc thêm một chỉ mục duy nhất trên cột email có đủ không? Bởi vì các trường duy nhất afaik cho phép giá trị null, trong khi tôi yêu cầu mọi người dùng phải có địa chỉ email, không cho phép giá trị null. Có điều gì tôi đang thiếu ở đây? Hoặc tôi cho rằng làm cho cột email trở nên độc đáo và đảm bảo trong quá trình xác thực dữ liệu trên máy chủ mà người dùng nhập địa chỉ email để mỗi người dùng có một địa chỉ?


3
Điều gì xảy ra khi người dùng thay đổi địa chỉ email của mình - vì họ sẽ thay đổi công việc
user151019

1
So sánh chuỗi không chỉ chậm hơn, chuỗi cũng có xu hướng lớn hơn so với nói, một số nguyên và do đó bạn có thể phù hợp với ít hơn trên một trang trong bộ nhớ, đẩy các lần đọc logic của bạn cho các truy vấn.
Không tên một

Câu trả lời:


7

Trước tiên, hãy phân biệt giữa khóa và chỉ mục, khóa là một phần của mô hình logic và thường được triển khai với một chỉ mục duy nhất. Tuy nhiên, bạn có thể tạo một chỉ mục duy nhất mà không cần tạo khóa, nhưng điều đó không thể được tham chiếu bởi khóa ngoại.

Khóa ứng viên là thứ xác định duy nhất một hàng trong bảng, trong SQL, một trong các khóa ứng cử viên thường được sử dụng làm khóa chính (tôi không bao giờ thực sự hiểu tại sao một trong các ck được che giấu "tốt hơn" so với các khóa khác, nhưng đó là một khóa khác câu chuyện), và ck còn lại trở thành những ràng buộc độc đáo.

Một ràng buộc duy nhất có thể được sử dụng giống như một khóa chính có thể. Xem xét:

create table A ( x ... not null
               , y ... not null
               , z ... not null
               ,     unique (x)
               ,     primary key (y,z) );

create table B ( x ...
               ,   ...
               ,     foreign key (x) references A (x) );

create table C ( y ...
               , z ...
               ,   ...
               ,     foreign key (y, z) references A (y, z) );  

B tham chiếu các ràng buộc duy nhất và C tham chiếu các ràng buộc khóa chính.

KHÔNG NULL là một loại ràng buộc khác. Trong trường hợp của bạn, bạn có thể thực thi điều này cho email mà không cần khai báo nó là duy nhất.

Khía cạnh tiếp theo của bài đăng của bạn liên quan đến tính ổn định của khóa, khóa phải ổn định (nhưng điều đó không có nghĩa là nó không bao giờ có thể thay đổi, nó không phải là bất biến). Một số DBMS triển khai TRÊN CASCADE CẬP NHẬT có thể giúp ích cho hoạt động đó, tuy nhiên nếu khóa được phân phối xung quanh mô hình của bạn thì sẽ rất khó để cập nhật nó.

Trong trường hợp của bạn, tôi có thể chọn một khóa ứng viên khác làm khóa chính và khai báo email là KHÔNG PHẢI và ĐỘC ĐÁO.


1
Trong SQL Server, bạn có thể tham chiếu một chỉ mục duy nhất là FK.
Martin Smith

1
Tôi không có quyền truy cập vào sql vì vậy tôi không thể tự kiểm tra, liệu nó có tạo ra một ràng buộc duy nhất khi bạn tạo một chỉ mục duy nhất không?
Lennart

1
Không. Một ràng buộc duy nhất được xử lý hơi khác nhau và có một số siêu dữ liệu bổ sung và các hạn chế bổ sung so với một chỉ mục duy nhất nhưng SQL Server cho phép hoặc được sử dụng trong FK.
Martin Smith

1
Điều đó hơi kỳ lạ sau đó, các chỉ mục thậm chí không được đề cập trong tiêu chuẩn sql trong khi các khóa là một phần trung tâm của nó. Nhưng dù sao, cảm ơn thông tin.
Lennart

Điều đáng chú ý là nếu có nhiều hồ sơ nước ngoài được gửi vào email của bạn, có thể mất một chút thời gian để cập nhật tất cả các hồ sơ đó khi xếp tầng cập nhật.
cimmanon

6

Có một chỉ mục duy nhất trên cột EmailAddress sẽ ổn. Vấn đề duy nhất là nếu ai đó từ bỏ địa chỉ email sau khi đăng ký dịch vụ của bạn nhưng không cho bạn biết, thì bất cứ ai là chủ sở hữu của địa chỉ email đều cố gắng đăng ký. Nhưng đó là một trường hợp cạnh khá hiếm.

Nếu một Chỉ số duy nhất cho phép các giá trị null sẽ phụ thuộc vào nền tảng cơ sở dữ liệu của bạn. Oracle thì, SQL Server cho phép một giá trị NULL duy nhất. Bạn có thể giải quyết điều này bằng cách làm cho cột không cho phép các giá trị NULL, sau đó xây dựng chỉ mục duy nhất trên đó.


1
Điều đó không đúng về máy chủ SQL. Bạn có thể tạo các chỉ mục với wherecác mệnh đề, ví dụ, cho phép bạn loại trừ NULLcác giá trị khỏi chỉ mục.
Kirk Woll

1
Tuyên bố SQL Server allows a single NULL valuevẫn đúng. Nó không nói rằng không có cách nào để có được nhiều NULLgiá trị. Tôi nghĩ rằng câu trả lời đã cố gắng giữ câu trả lời đơn giản và không giải thích thêm chi tiết (như được lập chỉ mục).
Brandon

1
Vâng, tôi có thể hạ được toàn bộ thỏ về các chỉ số được lọc nhưng một câu hỏi đơn giản thường cần một câu trả lời đơn giản. Không có nền tảng cơ sở dữ liệu và phiên bản, tôi giữ câu trả lời chung chung.
mrdenny

2

Có chỉ số duy nhất trên EmailAddress là tốt.

Như bạn đã nói rằng có xác thực trong ứng dụng của bạn để có Địa chỉ Email là trường bắt buộc, tôi sẽ nói rằng việc xác thực khác sẽ từ cơ sở dữ liệu không chấp nhận người dùng không có địa chỉ Email và cũng ngăn chặn việc nhập trùng lặp và xác thực sẽ được áp đặt với Chỉ số duy nhất này.

Như đã nêu trong câu trả lời khác cho SQL Server, bạn cần tạo một cột không cho phép giá trị null trước khi xây dựng các chỉ mục duy nhất.

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.