Kullanımının "Composite keys as PRIMARY KEY is bad practice"tamamen saçmalık olduğunu söylemek !
Kompozit PRIMARY KEYs genellikle çok "iyi bir şey" dir ve günlük yaşamda meydana gelen doğal durumları modellemenin tek yoludur!
Öğrencilerin ve derslerin klasik Veritabanları-101 öğretim örneğini ve birçok öğrenci tarafından alınan birçok dersi düşünün!
Tablo kursu ve öğrenci oluşturun:
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)
);
Size PostgreSQL lehçesinde (ve MySQL ) örnek vereceğim - biraz tweaking ile herhangi bir sunucu için çalışmalıdır.
Şimdi, belli ki öğrenci hangi ders alıyor aldığını izlemek istiyoruz - Bir denen zorunda joining table(diğer adıyla linking, many-to-manyveya m-to-ntablolar). Ayrıca associative entitiesdaha teknik jargonda da bilinirler !
1 dersin birçok öğrencisi olabilir.
1 öğrenci birçok ders alabilir .
Böylece, bir birleştirme tablosu oluşturursunuz
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)
);
Şimdi, bu tabloya anlamlı bir şekilde a vermenin tek yolu PRIMARY KEY, bunu KEYelbette ve öğrencinin bir kombinasyonu haline getirmektir . Bu şekilde elde edemezsiniz:
bir öğrenci ve ders kombinasyonu kopyası
Ayrıca, KEYöğrenci başına kurs için hazır bir arama yapıyorsunuz - AKA kapsayan bir endeks ,
hiç ders almayan öğrenciler ve öğrenciler olmadan ders bulmak önemsizdir!
- db-fiddle örneğinin PK kısıtlaması OLUŞTUR TABLOSUNA katlanmış olması - Her iki şekilde de yapılabilir. CREATE TABLE ifadesinde her şeyin olmasını tercih ederim.
ALTER TABLE course_student
ADD CONSTRAINT course_student_pk
PRIMARY KEY (cs_course_id, cs_student_id);
Şimdi, öğrenci tarafından UNIQUE INDEXyapılan aramanın yavaş olduğunu tespit ediyorsanız, on (sc_student_id, sc_course_id) kullanabilirsiniz.
ALTER TABLE course_student
ADD CONSTRAINT course_student_sc_uq
UNIQUE (cs_student_id, cs_course_id);
Orada hiçbir onlar - dizinleri eklemek için gümüş kurşun edecek hale INSERTs ve UPDATEyavaş s, ama derece büyük yararı de azalanSELECT kez! Bu onların bilgi ve deneyim verilen endekse karar vermek ancak kompozit söylemek geliştirici kalmış PRIMARY KEYler vardır hep sadece düz yanlış kötü.
Tablolara katılma durumunda, genellikle mantıklı olan tek PRIMARY KEY şeydir! Tablolara katılmak, iş veya doğa ya da düşünebildiğim hemen hemen her alanda olanları modellemenin tek yoludur.
Bu PK aynı zamanda covering indexaramaların hızlanmasına yardımcı olabilecek bir kullanım alanıdır . Bu durumda, bir kişinin düzenli olarak (course_id, student_id) arama yapması özellikle yararlı olabilir, ki bu çoğu zaman böyle olabilir!
Bu, bir kompozitin PRIMARY KEYçok iyi bir fikir olabileceği küçük bir örnektir ve gerçekliği modellemenin tek akılcı yolu! Başımın üstünden, çok daha fazlasını düşünebilirim .
Kendi işimden bir örnek!
Bir flight_id, kalkış ve varış havalimanları listesi ve ilgili saatleri içeren bir uçuş masasını ve mürettebat üyeleriyle birlikte bir cabin_crew masasını düşünün!
Bunun modellenebilmesinin tek aklı yolu, flight_id ve crew_id ile att_ olarak bir flight_crew masaya sahip olmak ve tek aklı başında PRIMARY KEYiki alanın bileşik anahtarını kullanmaktır!