Kullanımının "Composite keys as PRIMARY KEY is bad practice"
tamamen saçmalık olduğunu söylemek !
Kompozit PRIMARY KEY
s 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-many
veya m-to-n
tablolar). Ayrıca associative entities
daha 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 KEY
elbette 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 INDEX
yapı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 INSERT
s ve UPDATE
yavaş 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 KEY
ler 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 index
aramaları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 KEY
iki alanın bileşik anahtarını kullanmaktır!