Kunci komposit tidak boleh dipertimbangkan dalam aplikasi "baru". Mereka digunakan di masa lalu, oleh orang-orang yang dulu berpikir bahwa "kunci bisnis" lebih baik daripada "kunci pengganti".
Sunting:Seperti yang ditanyakan oleh Chris, saya memperluas jawaban saya.
Mari saya mulai dengan menyatakan bahwa saya memahami pertanyaan ini sebagai "Kunci Utama Gabungan" vs. "Kunci pengganti".
Juga, saya mengakui bahwa ada satu kasus penggunaan di mana kunci komposit masuk akal:dalam tabel referensi silang, juga disebut "tabel tautan". Ini digunakan dalam tabel banyak-ke-banyak dan hanya terdiri dari dua bidang, keduanya kunci asing yang membentuk kunci utama untuk tabel xref. Misalnya, UserRole
tabel akan berisi user_id
dan role_id
, tidak ada lagi. Tidak ada representasi kelas di Java, misalnya, untuk tabel seperti ini. Ini biasanya @ManyToMany
, dengan Collection
di kedua sisi.
Saya membagikan pandangan saya tentang kunci Alami vs. Kunci pengganti di jawaban lain ( Hibernate :Opini dalam PK Komposit vs Pengganti PK ), dan saya percaya bahwa kunci Komposit berbagi beberapa kelemahan dari kunci Alami, tanpa membawa manfaat nyata apa pun.
Masalah dengan kunci komposit adalah Anda memerlukan dua nilai untuk mengidentifikasi catatan secara unik. Ini menjadi masalah setelah Anda mulai memiliki tabel yang mereferensikan catatan di tabel pertama ini. Tabel kedua membutuhkan dua kolom untuk dapat mereferensikan satu catatan. Dan jika tabel kedua ini menggunakan kunci komposit yang terdiri dari satu nilai + kunci asing, Anda sekarang memiliki tiga kolom untuk secara unik mengidentifikasi satu catatan. Dan meja ketiga akan membutuhkan tiga ini kolom tambahan hanya untuk referensi satu dicatat di tabel kedua. Sungguh, ini adalah bola salju.
Kerugian lainnya adalah bahwa persyaratan lakukan mengubah. Sepanjang waktu. Jadi, apa yang tampaknya menjadi kunci komposit yang baik hari ini bukanlah kunci sama sekali besok. Itu sebabnya kami memiliki kunci pengganti:untuk menjadi bukti masa depan.
Kunci komposit terutama digunakan agar catatan dalam tabel unik berdasarkan kumpulan kolom. Misalnya, jika Anda memiliki Customers
tabel, Anda mungkin memiliki NationalId
+Country
sebagai nilai unik, artinya dua pengguna tidak dapat berbagi SSN yang sama jika negara mereka adalah AS. Tetapi dimungkinkan untuk memiliki nomor yang sama untuk dua catatan, jika mereka tidak berada di negara yang sama. Jika Anda menyukai kunci komposit, ini akan menjadi kandidat yang baik untuk itu. Tetapi seperti yang saya sebutkan sebelumnya, Anda dapat menggunakan kunci pengganti dan menerapkan unique
paksaan. Anda akan mendapatkan manfaat dari kunci komposit ditambah keamanan kunci pengganti.