말의 사용 "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 INDEXon (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두 분야의 복합 키를 사용하는 것입니다!