말의 사용 "Composite keys as PRIMARY KEY is bad practice"
은 전혀 말도 안된다!
합성물 PRIMARY KEY
은 종종 매우 "좋은 것"이며 일상 생활에서 발생하는 자연 상황을 모델링하는 유일한 방법입니다!
학생들과 과정의 많은 전형적인 과정 인 Databases-101 교육 예제와 많은 학생들이 수강 한 많은 과정을 생각해보십시오!
테이블 코스와 학생 만들기 :
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)
);
PostgreSQL 방언 (및 MySQL ) 의 예 를 들겠습니다. 약간의 조정이 필요한 모든 서버에서 작동해야합니다.
지금, 당신은 분명 학생이 어떤 과정 복용하는 추적 할 - 당신이 불리는 것을 그래서 joining table
(또한 linking
, many-to-many
또는 m-to-n
테이블). 그들은 또한 associative entities
더 전문적인 전문 용어 로 알려져 있습니다 !
1 코스에는 많은 학생들 이있을 수 있습니다.
1 명의 학생이 많은 코스를 수강 할 수 있습니다 .
따라서 조인 테이블을 만듭니다.
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)
);
이제이 표를 현명하게 줄 수 있는 유일한 방법 은 코스와 학생의 조합 PRIMARY KEY
을 만드는 것입니다 KEY
. 그렇게하면 얻을 수 없습니다 :
학생과 코스 조합의 사본
당신은 또한 기성품 검색이 KEY
일명 - 학생 당 과정에 포함하는 인덱스를 ,
학생들과 과정을 수강하지 않는 학생들이없는 과정을 찾는 것은 사소한 일입니다!
-db-fiddle 예제 에는 PK 제약 조건이 CREATE TABLE로 접혀져 있습니다. 어느 쪽이든 수행 할 수 있습니다. CREATE TABLE 문에 모든 것을 포함하고 싶습니다.
ALTER TABLE course_student
ADD CONSTRAINT course_student_pk
PRIMARY KEY (cs_course_id, cs_student_id);
이제 코스 별 학생 검색이 느리다는 것을 발견 한 경우 UNIQUE INDEX
on (sc_student_id, sc_course_id)을 사용할 수 있습니다.
ALTER TABLE course_student
ADD CONSTRAINT course_student_sc_uq
UNIQUE (cs_student_id, cs_course_id);
없습니다 에는 그들이 - 인덱스를 추가하기위한 묘책이 됩니다 만들 INSERT
들과 UPDATE
느린이야,하지만 상당히의 큰 이익의 감소SELECT
배! 지식과 경험을 바탕으로 색인을 생성하기로 결정하는 것은 개발자의 몫입니다. 그러나 합성물 PRIMARY KEY
이 항상 나쁘다는 것은 명백한 잘못입니다.
테이블을 조인하는 경우 일반적으로 유일 PRIMARY KEY
하게 의미가 있습니다! 또한 조인 테이블은 비즈니스 나 자연 또는 내가 생각할 수있는 거의 모든 분야에서 일어나는 일을 모델링하는 유일한 방법입니다.
이 PK는 covering index
검색 속도를 높이는데도 유용 합니다. 이 경우, 정기적으로 검색하는 경우 (course_id, student_id) 종종 유용 할 수 있습니다.
이것은 컴포지트 PRIMARY KEY
가 아주 좋은 아이디어가 될 수 있는 작은 예이며 현실을 모델링하는 유일한 방법입니다! 머리 꼭대기에서 더 많은 것을 생각할 수 있습니다 .
내 작품의 예!
flight_id, 출발 및 도착 공항 목록 및 관련 시간이 포함 된 비행 테이블과 승무원이있는 cabin_crew 테이블을 고려하십시오!
만 이 모델링 할 수 있습니다 제정신 방법은 flight_id 및 attibutes로 crew_id 유일한 제정신으로 flight_crew 테이블을 갖는 것은 PRIMARY KEY
두 분야의 복합 키를 사용하는 것입니다!