Composite Key (Khóa tổ hợp / Khóa kép / Composite Primary Key) là Primary Key được cấu thành từ **hai hoặc nhiều cột (attributes)** kết hợp cùng nhau để duy nhất xác định một hàng. Không một cột đơn lẻ nào trong tập hợp đó đủ duy nhất.
Đặc điểm
- Kết hợp 2+ cột:
PRIMARY KEY (col1, col2, ...). - Mỗi cột thành phần có thể trùng lặp, nhưng **tổ hợp** không trùng.
- Thứ tự cột trong composite key quan trọng (cho index, range query).
- Tất cả cột thành phần **bắt buộc NOT NULL**.
Ví dụ 1: Bảng OrderDetail (Chi tiết đơn hàng)
Mỗi dòng = 1 sản phẩm trong 1 đơn hàng. Một đơn hàng có nhiều sản phẩm, một sản phẩm nằm trong nhiều đơn hàng.
| OrderID (PK1) | ProductID (PK2) | Quantity | UnitPrice |
|---|---|---|---|
| 1001 | P001 | 2 | 100 |
| 1001 | P002 | 1 | 250 |
| 1002 | P001 | 3 | 100 |
Composite PK: (OrderID, ProductID).
OrderIDlặp (1001 xuất hiện 2 lần).ProductIDlặp (P001 xuất hiện 2 lần).- Cặp
(OrderID, ProductID)duy nhất.
Ví dụ 2: Bảng Student (Composite PK)
| StudentID (PK1) | StudentEnrollNo (PK2) | StudentMarks | StudentPercentage |
|---|---|---|---|
| S001 | 0721722 | 570 | 90 |
| S002 | 0721790 | 490 | 80 |
| S003 | 0721766 | 440 | 86 |
Composite PK: (StudentID, StudentEnrollNo).
Lý do: Có thể 2 campus khác nhau sinh ra cùng StudentID, hoặc cùng mã đăng ký nhưng năm khác nhau. Kết hợp cả 2 mới duy nhất tuyệt đối.
Composite Key vs Composite Index
| Đặc điểm | Composite Primary Key | Composite Index (Non-PK) |
|---|---|---|
| Mục đích | Định danh thực thể (Entity Integrity) | Tăng tốc truy vấn (Performance) |
| Unique | Bắt buộc | Có thể Unique hoặc Non-unique |
| NULL | Không cho phép (tất cả cột) | Cho phép (tùy DBMS) |
| Số lượng/bảng | 1 | Nhiều |
| Foreign Key tham chiếu | Phải tham chiếu đủ cột | Không được tham chiếu trực tiếp |
Foreign Key tham chiếu Composite PK
Bảng con phải có đủ các cột tương ứng:
CREATE TABLE OrderDetail ( OrderID INT NOT NULL, ProductID INT NOT NULL, Quantity INT, PRIMARY KEY (OrderID, ProductID), FOREIGN KEY (OrderID) REFERENCES Orders(OrderID), FOREIGN KEY (ProductID) REFERENCES Products(ProductID) -- HOẶC FK tổ hợp (nếu bảng cha cũng dùng composite PK): -- FOREIGN KEY (OrderID, ProductID) REFERENCES SomeTable(OrderID, ProductID) );
Ưu & Nhược điểm
| Ưu điểm | Nhược điểm |
|---|---|
| Tự nhiên mô hình thực thể yếu (weak entity), quan hệ many-to-many | FK tham chiếu phức tạp (cần đủ cột, join nhiều cột) |
| Không cần cột surrogate thêm (ID) | Index lớn hơn (multiple columns) |
| Ngăn chặn duplicate tự nhiên ở mức DB | Thay đổi PK rất khó (cascade update phức tạp) |
| Phù hợp junction table, mapping table | Kém hiệu quả nếu cột thành phần rộng (string dài) |
Best Practice hiện đại
- **Ưu tiên Surrogate Key (ID/BIGINT/UUID)** làm PK cho hầu hết bảng.
- Dùng **Unique Constraint** trên tổ hợp cột tự nhiên thay vì Composite PK.
- Chỉ dùng Composite PK khi:
- Bảng junction (many-to-many) thuần túy, không có attribute riêng.
- Yêu cầu nghiệp vụ bắt buộc (legacy, standard).
- Data Warehouse: Dimension table với natural composite key.
Tóm lại: Composite Key là PK gồm nhiều cột. Hữu ích cho weak entity, many-to-many mapping, nhưng phức tạp cho FK và join. Thiết kế hiện đại thường thay bằng Surrogate PK + Unique Constraint.