Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> SQL

Composite Key (Khóa tổ hợp) trong RDBMS


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
1001P0012100
1001P0021250
1002P0013100

Composite PK: (OrderID, ProductID).

  • OrderID lặp (1001 xuất hiện 2 lần).
  • ProductID lặ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
S001072172257090
S002072179049080
S003072176644086

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ểmComposite Primary KeyComposite Index (Non-PK)
Mục đíchĐịnh danh thực thể (Entity Integrity)Tăng tốc truy vấn (Performance)
UniqueBắt buộcCó thể Unique hoặc Non-unique
NULLKhông cho phép (tất cả cột)Cho phép (tùy DBMS)
Số lượng/bảng1Nhiều
Foreign Key tham chiếuPhải tham chiếu đủ cộtKhô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ểmNhượ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.