Saya ingin tahu apakah kunci primer komposit adalah praktik yang buruk dan jika tidak, skenario mana yang disarankan untuk digunakan.
Pertanyaan saya didasarkan pada artikel ini
Bagian tentang kunci primer komposit:
Praktik Buruk No. 6: Kunci Utama Komposit
Ini adalah semacam poin yang kontroversial, karena banyak perancang basis data saat ini berbicara tentang menggunakan bidang ID bilangan bulat yang dihasilkan secara otomatis sebagai kunci utama dan bukan kunci komposit yang ditentukan oleh kombinasi dua atau lebih bidang. Ini saat ini didefinisikan sebagai "praktik terbaik" dan, secara pribadi, saya cenderung menyetujuinya.
Namun, ini hanya sebuah konvensi dan, tentu saja, DBE memungkinkan definisi kunci primer komposit, yang menurut banyak desainer tidak dapat dihindari. Oleh karena itu, seperti halnya redundansi, kunci primer komposit adalah keputusan desain.
Namun waspadalah, jika meja Anda dengan kunci primer komposit diharapkan memiliki jutaan baris, indeks yang mengendalikan kunci komposit dapat tumbuh hingga titik di mana kinerja operasi CRUD sangat menurun. Dalam hal ini, jauh lebih baik untuk menggunakan kunci primer ID integer sederhana yang indeksnya akan cukup kompak dan menetapkan batasan DBE yang diperlukan untuk mempertahankan keunikan.
sumber
Jawaban:
Untuk mengatakan bahwa penggunaannya
"Composite keys as PRIMARY KEY is bad practice"
adalah omong kosong!Komposit
PRIMARY KEY
sering kali merupakan "hal yang sangat baik" dan satu-satunya cara untuk memodelkan situasi alami yang terjadi dalam kehidupan sehari-hari!Pikirkan contoh pengajaran Databases-101 klasik tentang siswa dan kursus dan banyak kursus yang diambil oleh banyak siswa!
Buat tabel kursus dan siswa:
Saya akan memberi Anda contoh dalam dialek PostgreSQL (dan MySQL ) - harus bekerja untuk server apa pun dengan sedikit penyesuaian.
Sekarang, Anda jelas ingin melacak siswa mana yang mengambil kursus mana - jadi Anda memiliki apa yang disebut
joining table
(juga disebutlinking
,many-to-many
ataum-to-n
tabel). Mereka juga dikenal sebagaiassociative entities
jargon yang lebih teknis!1 kursus dapat memiliki banyak siswa.
1 siswa dapat mengikuti banyak kursus.
Jadi, Anda membuat tabel bergabung
Sekarang, satu - satunya cara untuk memberikan tabel ini dengan bijaksana
PRIMARY KEY
adalah dengan membuatKEY
kombinasi antara kursus dan siswa. Dengan begitu, Anda tidak bisa mendapatkan:duplikat kombinasi siswa dan kursus
suatu kursus hanya dapat mendaftarkan siswa yang sama satu kali, dan
seorang siswa hanya dapat mendaftar di kursus yang sama satu kali saja
Anda juga memiliki pencarian yang sudah jadi
KEY
pada kursus per siswa - AKA indeks yang mencakup ,itu sepele untuk menemukan kursus tanpa siswa dan siswa yang tidak mengambil kursus!
- The db-biola misalnya memiliki kendala PK dilipat ke dalam CREATE TABLE - Hal ini dapat dilakukan dengan cara baik. Saya lebih suka memiliki semuanya dalam pernyataan CREATE TABLE.
Sekarang, Anda bisa, jika Anda menemukan bahwa pencarian untuk siswa oleh kursus lambat, gunakan
UNIQUE INDEX
on (sc_student_id, sc_course_id).Tidak ada peluru perak untuk menambahkan indeks - mereka akan membuat
INSERT
s danUPDATE
s lebih lambat, tetapi pada manfaat besar kali sangat menurunSELECT
! Terserah pengembang untuk memutuskan untuk indeks yang diberikan pengetahuan dan pengalaman mereka, tetapi untuk mengatakan bahwa kompositPRIMARY KEY
s yang selalu buruk hanya salah polos.Dalam kasus bergabung dengan tabel, mereka biasanya satu - satunya
PRIMARY KEY
yang masuk akal! Bergabung dengan tabel juga sangat sering menjadi satu-satunya cara untuk memodelkan apa yang terjadi dalam bisnis atau alam atau dalam hampir setiap bidang yang dapat saya pikirkan!PK ini juga digunakan sebagai
covering index
yang dapat membantu mempercepat pencarian. Dalam hal ini, akan sangat berguna jika seseorang mencari secara teratur di (course_id, student_id) yang, bisa dibayangkan, sering menjadi kasus!Ini hanyalah contoh kecil di mana komposit
PRIMARY KEY
bisa menjadi ide yang sangat bagus, dan satu-satunya cara yang waras untuk memodelkan kenyataan! Dari atas kepala saya, saya bisa memikirkan banyak lagi.Contoh dari pekerjaan saya sendiri!
Pertimbangkan tabel penerbangan yang berisi flight_id, daftar bandara keberangkatan dan kedatangan serta waktu yang relevan dan kemudian juga tabel cabin_crew dengan anggota kru!
Satu- satunya cara yang waras ini dapat dimodelkan adalah memiliki tabel flight_crew dengan flight_id dan crew_id sebagai attibutes dan satu-satunya yang waras
PRIMARY KEY
adalah dengan menggunakan kunci komposit dari dua bidang!sumber
id
kunci utama dan indeks unikcs_student_id
cs_course_id
dan memiliki hasil yang sama?Pandangan saya yang setengah berpendidikan: "kunci utama" tidak harus menjadi satu-satunya kunci unik yang digunakan untuk mencari data di tabel, meskipun alat manajemen data akan menawarkannya sebagai pilihan default. Jadi untuk memilih apakah memiliki gabungan dua kolom atau angka acak (mungkin serial) sebagai kunci tabel, Anda dapat memiliki dua kunci berbeda sekaligus.
Jika nilai data menyertakan istilah unik yang cocok yang dapat mewakili baris, saya lebih suka menyatakan itu sebagai "kunci utama", bahkan jika komposit, daripada menggunakan kunci "sintetis". Kunci sintetik mungkin berkinerja lebih baik karena alasan teknis, tetapi pilihan standar saya sendiri adalah untuk menunjuk dan menggunakan istilah nyata sebagai kunci utama, kecuali jika Anda benar-benar harus pergi ke arah lain untuk membuat layanan Anda berfungsi.
Microsoft SQL Server memiliki fitur berbeda tetapi terkait dari "indeks berkerumun" yang mengontrol penyimpanan fisik data dalam urutan indeks, dan juga digunakan di dalam indeks lain. Secara default, kunci utama dibuat sebagai indeks berkerumun, tetapi Anda dapat memilih bukan-berkerumun, lebih disukai setelah membuat indeks berkerumun. Jadi Anda dapat memiliki kolom yang dihasilkan identitas bilangan bulat sebagai indeks berkerumun, dan, katakanlah, nama file nvarchar (128 karakter) sebagai kunci utama. Ini mungkin lebih baik karena kunci indeks berkerumun sempit, bahkan jika Anda menyimpan nama file sebagai istilah kunci asing di tabel lain - meskipun contoh ini adalah kasus yang baik untuk juga tidak melakukan itu.
Jika desain Anda melibatkan mengimpor tabel data yang menyertakan kunci primer yang tidak nyaman untuk mengidentifikasi data terkait, maka Anda cukup terjebak dengan itu.
https://www.techopedia.com/definition/5547/primary-key menjelaskan contoh memilih apakah akan menyimpan data dengan nomor jaminan sosial pelanggan sebagai kunci pelanggan di semua tabel data, atau untuk menghasilkan customer_id sewenang-wenang ketika Anda daftarkan mereka. Sebenarnya, ini adalah pelanggaran berat terhadap SSN, selain dari itu berhasil atau tidak; ini adalah nilai data pribadi dan rahasia.
Jadi, keuntungan menggunakan fakta dunia nyata sebagai kuncinya adalah bahwa tanpa bergabung kembali ke tabel "Pelanggan", Anda dapat mengambil informasi tentang mereka di tabel lain - tetapi juga masalah keamanan data.
Selain itu, Anda dalam masalah jika SSN atau kunci data lainnya salah direkam, sehingga Anda memiliki nilai yang salah di 20 tabel terbatas dan bukan hanya di "Pelanggan". Sedangkan customer_id sintetis tidak memiliki makna eksternal sehingga tidak dapat menjadi nilai yang salah.
sumber