기본 키는 테이블에서 각 행을 고유하게 식별하는 열 또는 열의 조합이다. 값이 중복되거나 NULL이어서는 안 된다. 문서 제목처럼 바뀌거나 중복될 수 있는 정보와 별도로 안정적인 식별자를 두면 수정 이력과 다른 데이터의 연결을 유지하기 쉽다.
한 행을 식별하는 기준
PostgreSQL의 테이블에는 기본 키를 하나 지정할 수 있으며, 그 키가 여러 열로 구성될 수 있다. CREATE TABLE의 키 제약 기본 키 선언은 고유성과 NULL 금지를 보장하고 고유 인덱스를 만든다. 숫자가 자동으로 증가하는 기능과 기본 키 제약은 서로 다른 개념이다. PostgreSQL 제약 조건 설명
문서와 번역의 예
한 문서가 여러 언어로 존재한다면 문서 자체의 식별자와 번역 행의 식별을 구분할 수 있다. 예를 들어 번역 테이블에서 문서 번호와 언어의 조합을 키로 삼으면 같은 문서의 같은 언어를 두 번 저장하지 않도록 할 수 있다.
| 후보 값 | 설계할 때의 질문 |
|---|---|
| 제목 | 이름이 바뀌거나 겹치는가 |
| 별도 문서 번호 | 생성 방식과 고유성을 보장하는가 |
| 문서 번호와 언어 | 조합 전체가 한 행을 나타내는가 |
외부에 노출할 주소와 내부 키를 반드시 동일하게 만들 필요는 없다. 주소를 바꾸더라도 내부 참조가 유지되도록 설계할 수 있다.
기본 키가 보장하지 않는 것
기본 키가 다르면 데이터베이스는 서로 다른 행으로 취급한다. 따라서 같은 내용의 문서가 서로 다른 키로 들어오는 의미적 중복은 별도로 판단해야 한다. 이메일처럼 업무상 중복되면 안 되는 값에는 별도의 고유 제약이 필요할 수 있다.
다른 테이블이 이 행을 참조할 때는 외래 키를 함께 설계한다. 키가 있으니 모든 검색이 빠를 것이라고 생각해서도 안 된다. 제목 검색이나 정렬 성능은 해당 요청과 인덱스를 따로 살펴야 한다.