Untuk mengatakan bahwa penggunaannya "Composite keys as PRIMARY KEY is bad practice"adalah omong kosong!
Komposit PRIMARY KEYsering 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:
CREATE TABLE course
(
course_id SERIAL,
course_year SMALLINT NOT NULL,
course_name VARCHAR (100) NOT NULL,
CONSTRAINT course_pk PRIMARY KEY (course_id)
);
CREATE TABLE student
(
student_id SERIAL,
student_name VARCHAR (50),
CONSTRAINT student_pk PRIMARY KEY (student_id)
);
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 disebut linking, many-to-manyatau m-to-ntabel). Mereka juga dikenal sebagai associative entitiesjargon yang lebih teknis!
1 kursus dapat memiliki banyak siswa.
1 siswa dapat mengikuti banyak kursus.
Jadi, Anda membuat tabel bergabung
CREATE TABLE course_student
(
cs_course_id INTEGER NOT NULL,
cs_student_id INTEGER NOT NULL,
-- now for FK constraints - have to ensure that the student
-- actually exists, ditto for the course.
CREATE CONSTRAINT cs_course_fk FOREIGN KEY (cs_course_id) REFERENCES course (course_id),
CREATE CONSTRAINT cs_student_fk FOREIGN KEY (cs_student_id) REFERENCES student (student_id)
);
Sekarang, satu - satunya cara untuk memberikan tabel ini dengan bijaksana PRIMARY KEYadalah dengan membuat KEYkombinasi 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 KEYpada 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.
ALTER TABLE course_student
ADD CONSTRAINT course_student_pk
PRIMARY KEY (cs_course_id, cs_student_id);
Sekarang, Anda bisa, jika Anda menemukan bahwa pencarian untuk siswa oleh kursus lambat, gunakan UNIQUE INDEXon (sc_student_id, sc_course_id).
ALTER TABLE course_student
ADD CONSTRAINT course_student_sc_uq
UNIQUE (cs_student_id, cs_course_id);
Tidak ada peluru perak untuk menambahkan indeks - mereka akan membuat INSERTs dan UPDATEs 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 komposit PRIMARY KEYs yang selalu buruk hanya salah polos.
Dalam kasus bergabung dengan tabel, mereka biasanya satu - satunyaPRIMARY 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 indexyang 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 KEYbisa 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 KEYadalah dengan menggunakan kunci komposit dari dua bidang!