Nó phụ thuộc
Có nhiều cuộc thảo luận hiện có về sự cân bằng giữa Khóa tự nhiên và khóa thay thế - bạn sẽ cần quyết định xem điều gì phù hợp với bạn và 'tiêu chuẩn' là gì trong tổ chức của bạn.
Trong trường hợp của OP, có cả khóa thay thế (int userId
) và một khóa tự nhiên (char
hoặc varchar username
). Một trong hai cột có thể được sử dụng làm khóa Chính cho bảng và theo cách nào đó, bạn vẫn có thể thực thi tính duy nhất của khóa kia.
Dưới đây là một số cân nhắc khi chọn cách này hay cách khác:
Trường hợp sử dụng Khóa thay thế (ví dụ:UserId INT AUTO_INCREMENT)
Nếu bạn sử dụng một đại diện thay thế, (ví dụ:UserId INT AUTO_INCREMENT
) làm Khóa chính, sau đó là tất cả các bảng tham chiếu đến bảng MyUsers
sau đó nên sử dụng UserId
làm Khóa ngoại.
Tuy nhiên, bạn vẫn có thể thực thi tính duy nhất của username
thông qua việc sử dụng thêm chỉ mục duy nhất
, ví dụ:
CREATE TABLE `MyUsers` (
`userId` int NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
... other columns
PRIMARY KEY(`userId`),
UNIQUE KEY UQ_UserName (`username`)
Theo @Dagon, sử dụng khóa chính hẹp (như int
) có lợi ích về hiệu suất và lưu trữ so với việc sử dụng giá trị rộng hơn (và độ dài thay đổi) như varchar
. Lợi ích này cũng tác động đến các bảng khác tham chiếu đến MyUsers
, làm khóa ngoại cho userid
sẽ hẹp hơn (tìm nạp ít byte hơn).
Một lợi ích khác của khóa số nguyên thay thế là tên người dùng có thể được thay đổi dễ dàng mà không ảnh hưởng đến các bảng tham chiếu MyUsers
.Nếu username
đã được sử dụng làm khóa tự nhiên và các bảng khác được ghép nối với MyUsers
qua username
, sẽ rất bất tiện khi thay đổi tên người dùng (vì nếu không thì mối quan hệ Khoá ngoại sẽ bị vi phạm). Nếu cần cập nhật tên người dùng trên các bảng bằng username
làm khóa ngoại, một kỹ thuật như BẬT CẬP NHẬT CASCADE
là cần thiết để duy trì tính toàn vẹn của dữ liệu.
Trường hợp sử dụng Phím tự nhiên (tức là tên người dùng)
Một nhược điểm của việc sử dụng Khóa thay thế là các bảng khác tham chiếu đến MyUsers
thông qua một khóa đại diện sẽ cần phải là JOIN
quay lại MyUsers
bảng nếu Username
cột là bắt buộc. Một trong những lợi ích tiềm năng của Khóa tự nhiên là nếu một truy vấn chỉ yêu cầu Username
từ một bảng tham chiếu đến MyUsers
, rằng nó không cần tham gia trở lại MyUsers
để truy xuất tên người dùng, điều này sẽ tiết kiệm một số chi phí I / O.