Secondary Key (Khóa phụ / Alternate Key) là **Candidate Key (Khóa ứng viên) KHÔNG được chọn làm Primary Key**. Nó vẫn đảm bảo tính duy nhất (unique) và có thể dùng để truy vấn, index, nhưng không phải khóa chính đại diện cho thực thể.
Định nghĩa chính xác
- Candidate Key: Thuộc tính (hoặc tập hợp) đủ điều kiện làm PK (duy nhất, tối thiểu, không NULL).
- Primary Key: Candidate Key được **chọn** làm đại diện chính.
- Secondary Key (Alternate Key): Các Candidate Key **còn lại** sau khi chọn PK.
⚠️ Lưu ý quan trọng: Secondary Key **KHÔNG PHẢI** Foreign Key. Foreign Key tham chiếu PK của bảng khác. Secondary Key là khóa duy nhất của **chính bảng đó**.
Ví dụ 1: Bảng Student
| Student_ID | Student_Enroll | Student_Name | Student_Age | Student_Email |
|---|---|---|---|---|
| 096 | 9122717 | Manish | 25 | aaa@gmail.com |
| 055 | 9122655 | Manan | 23 | abc@gmail.com |
| 067 | 9122699 | Shreyas | 28 | pqr@gmail.com |
Phân tích:
- Candidate Keys:
{Student_ID},{Student_Enroll},{Student_Email}(mỗi cái đều duy nhất, không NULL, tối thiểu). - Chọn
Student_IDlàm Primary Key. - Secondary Keys:
Student_EnrollvàStudent_Email.
Ví dụ 2: Bảng Employee
| Employee_ID | Employee_No | Employee_Name | Employee_Email | Employee_Dept |
|---|---|---|---|---|
| 0989 | E7897 | Jacob | jacob@example.com | Finance |
| 0777 | E8768 | Anna | anna@example.com | HR |
| 0656 | E8789 | Tom | tom@example.com | Operations |
Phân tích:
- Candidate Keys:
Employee_ID,Employee_No,Employee_Email. - Chọn
Employee_IDlàm PK. - Secondary Keys:
Employee_No,Employee_Email.
So sánh: Secondary Key vs Foreign Key vs Primary Key
| Đặc điểm | Primary Key | Secondary Key | Foreign Key |
|---|---|---|---|
| Số lượng/bảng | 1 | 0 hoặc nhiều | 0 hoặc nhiều | Duy nhất (Unique) | Có | Có | Không (có thể trùng) | Cho phép NULL | Không | Thường không (unique constraint) | Có (nếu không NOT NULL) | Vai trò | Định danh chính | Định danh thay thế, tìm kiếm | Liên kết bảng khác | Tham chiếu | Không | Không | PK của bảng khác |
Ứng dụng thực tế
- Tạo **Unique Index** trên Secondary Key để tăng tốc truy vấn (tìm kiếm theo email, số CMND, mã nhân viên...).
- Dùng trong **WHERE clause**,
JOIN(khi join trên alternate key). - Hỗ trợ **Business Key** trong Data Warehouse (Natural Key).
- Dùng cho
ON CONFLICT (secondary_key) DO UPDATE(PostgreSQL upsert).
Best Practice
- Luôn khai báo
UNIQUE CONSTRAINThoặcUNIQUE INDEXcho Secondary Key. - Đặt tên constraint rõ ràng:
UK_student_email,UK_employee_no. - Không dùng Secondary Key làm Foreign Key target (dùng PK).
- Nếu Secondary Key thay đổi (ví dụ đổi email), cần cập nhật cẩn thận (cascade hoặc application logic).