복합기본키란 다음과 같이 여러 칼럼의 튜플을 기본키로 지정하는 것이다.
CREATE TABLE MY_TABLE
(
ID BIGINT NOT NULL,
TYPE VARCHAR(100) NOT NULL,
PRIMARY KEY (ID, TYPE)
)
이때, 쉽게 간과할 수 있는 사실이 있는데, 바로 복합기본키는 지정하는 순서가 중요하다는 것이다.
예를 들어 다음과 두 ddl은 다른 결과를 낳는다.
PRIMARY KEY (ID, TYPE)
PRIMARY KEY (TYPE, ID)
그 이유는 b-tree 인덱싱에 있다.
postgres는 PK가 지정되면 자동으로 index테이블을 생성한다. (postgresql 공식 문서)
이 때, 이 인덱스는 b-tree 자료구조를 사용하는데,
b-tree 특성상 먼저온 칼럼을 기준으로 분기를 하기 때문에, 이렇게 생성된 index는 뒤에 온 칼럼 기준으론 사용하지 못한다.
여기 이에 대한 내용을 대략 설명한 블로그가 있다. 참고하자.
DB - 결합인덱스 및 컬럼 순서 결정 방법