Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chuỗi hoặc int có được ưu tiên cho các khóa ngoại không?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn đối sánh chính xác của một chuỗi trong SQL

  2. Cơ sở dữ liệu MySQL có thể lớn đến mức nào trước khi hiệu suất bắt đầu giảm

  3. Lỗi cú pháp SQL - không thể tìm thấy lỗi

  4. Tìm phòng miễn phí (hệ thống đặt phòng)

  5. Kết nối lại MySQL khi hết thời gian