Khóa tổng hợp không bao giờ được xem xét trong các ứng dụng "mới". Chúng đã được sử dụng trong quá khứ, bởi những người thường nghĩ rằng "chìa khóa kinh doanh" tốt hơn "chìa khóa thay thế".
Chỉnh sửa:Theo câu hỏi của Chris, tôi đang mở rộng câu trả lời của mình.
Hãy để tôi bắt đầu bằng cách nói rằng tôi hiểu câu hỏi này là "Khóa chính tổng hợp" so với "Khóa thay thế".
Ngoài ra, tôi thừa nhận rằng có một trường hợp sử dụng trong đó khóa tổng hợp có ý nghĩa:trong các bảng tham chiếu chéo, còn được gọi là "bảng liên kết". Chúng được sử dụng trong nhiều bảng và chỉ bao gồm hai trường, cả hai đều là khóa ngoại tạo thành khóa chính cho bảng xref. Ví dụ:UserRole
bảng sẽ chứa user_id
và role_id
, không có gì khác. Chẳng hạn, không có biểu diễn lớp nào trong Java cho một bảng như thế này. Đây thường là @ManyToMany
, với Collection
ở cả hai phía.
Tôi đã chia sẻ quan điểm của mình về Khóa tự nhiên so với Khóa thay thế trong một câu trả lời khác ( Hibernate:Ý kiến trong PK tổng hợp so với PK thay thế ), và tôi tin rằng các khóa Composite có một số nhược điểm của khóa Natural, mà không mang lại bất kỳ lợi ích thực sự nào.
Vấn đề với các khóa tổng hợp là bạn sẽ cần hai giá trị để xác định duy nhất một bản ghi. Điều này sẽ trở thành vấn đề khi bạn bắt đầu có các bảng tham chiếu đến các bản ghi trong bảng đầu tiên này. Sau đó, bảng thứ hai cần hai các cột để có thể tham chiếu một ghi lại. Và nếu bảng thứ hai này sử dụng khóa tổng hợp được tạo thành từ một giá trị duy nhất + khóa ngoại, thì bây giờ bạn có ba các cột để xác định duy nhất một ghi lại. Và một bảng thứ ba sẽ cần những ba các cột bổ sung chỉ để tham chiếu một ghi vào bảng thứ hai. Thực sự, đây là một quả bóng tuyết.
Một bất lợi khác là các yêu cầu do biến đổi. Mọi lúc. Vì vậy, những gì có vẻ là một chìa khóa tổng hợp tốt ngày hôm nay hoàn toàn không phải là một chìa khóa vào ngày mai. Đó là lý do tại sao chúng tôi có các chìa khóa thay thế:để chứng minh trong tương lai.
Các khóa tổng hợp chủ yếu được sử dụng để các bản ghi trong bảng là duy nhất dựa trên một tập hợp các cột. Ví dụ:nếu bạn có Customers
bảng, bạn có thể có NationalId
+ Country
như một giá trị duy nhất, nghĩa là hai người dùng không thể chia sẻ cùng một SSN nếu quốc gia của họ là Hoa Kỳ. Nhưng có thể có cùng một số cho hai bản ghi, nếu chúng không ở cùng một quốc gia. Nếu bạn thích phím tổng hợp, đây sẽ là một ứng cử viên sáng giá cho nó. Nhưng như tôi đã gợi ý trước đó, bạn có thể sử dụng khóa thay thế và áp dụng unique
hạn chế. Bạn sẽ có những lợi ích của khóa tổng hợp cùng với sự an toàn của khóa thay thế.