• database
  • modeling

데이터베이스 키의 종류와 UNIQUE 제약

슈퍼키부터 후보키, 기본키, 대체키, 외래키까지 키의 종류와 암시적 기본키, UNIQUE 제약의 비용을 정리한다.

시리즈 · Database2 / 8
  1. E/R 모델 설계 원칙 정리
  2. 데이터베이스 키의 종류와 UNIQUE 제약
  3. 인덱스와 B-Tree, 그리고 스캔 방식
  4. JOIN의 종류와 구현 방식
  5. 트랜잭션의 ACID와 DBMS의 복구 전략: UNDO, REDO, WAL
  6. 데이터베이스 Lock: 공유 락·배타 락, 낙관적 락·비관적 락
  7. DB 클러스터링, 레플리케이션, 샤딩과 분산 트랜잭션
  8. PostgreSQL Vacuum 이해와 AutoVacuum 튜닝

키는 테이블에서 레코드를 서로 구별하기 위한 속성 또는 속성의 집합이다. 유일성과 최소성을 어디까지 만족하느냐에 따라 이름이 달라진다.

키의 종류

키 정의
슈퍼키(Super Key) 유일성을 만족하는 키
후보키(Candidate Key) 유일성과 최소성을 만족하는 키
기본키(Primary Key) 후보키 중에서 선택한 하나의 키
대체키(Alternate Key) 기본키로 선택되지 않고 남은 후보키
외래키(Foreign Key) 다른 테이블의 키를 참조하는 키

슈퍼키

유일성만 만족하면 된다. 어떤 속성끼리 묶든 중복 값이 나오지 않고 레코드를 구별할 수 있으면 슈퍼키다. 예를 들어 학번과 주민등록번호를 묶은 것도 슈퍼키다.

후보키

슈퍼키 중에서 속성의 개수가 최소인 키다. 유일성과 최소성을 모두 만족하며, 기본키가 될 수 있는 후보다. 학번, 주민등록번호가 각각 후보키다.

기본키

후보키 중에서 하나를 선택한 키다.

  • 테이블에 오직 1개만 지정할 수 있다.
  • NULL을 가질 수 없고, 중복된 값을 가질 수 없다.

대체키

후보키가 두 개 이상일 때 기본키로 지정하고 남은 후보키다. 학번을 기본키로 정했다면 주민등록번호가 대체키이고, 기본키가 없어지면 그 자리를 대신할 수 있다.

외래키

다른 테이블의 레코드를 참조하는 키다.

  • 참조되는 테이블(부모)이 먼저 만들어지고, 그 값이 있어야 참조하는 테이블(자식)에 값을 입력할 수 있다.
  • 참조되는 컬럼은 부모 테이블의 기본키 또는 유니크 키여야 한다.
  • 자식 테이블이 참조하고 있는 동안에는 부모 테이블을 먼저 삭제할 수 없다.

기본키 수정 과정

이미 있는 기본키의 구성을 바꾸려면 다음 순서로 진행한다.

  1. 기존 PK를 삭제한다.
  2. PK에 추가할 컬럼에 NOT NULL 속성을 추가한다.
  3. PK를 다시 생성한다.

MySQL에서 기본키 없이 테이블을 만들 수 있는 이유

InnoDB 스토리지 엔진은 기본키를 지정하지 않아도 내부적으로 기본키 역할을 하는 값을 자동으로 만든다. 이를 암시적 기본키(implicit primary key)라고 한다. 물리적인 저장 공간의 일부가 되지만 테이블에는 보이지 않는다.

InnoDB가 클러스터링 키를 고르는 구체적인 규칙은 Real MySQL 8.0 Ch.8 — 클러스터링 인덱스, 유니크 인덱스, 외래키에 정리했다.

UNIQUE 제약의 성능

  • 삽입: 기존 데이터와 중복되는지 확인해야 하므로 추가 비용이 발생한다.
  • 검색: UNIQUE 제약은 유니크 인덱스로 구현되므로, 해당 컬럼으로 검색할 때 인덱스를 이용할 수 있어 빨라진다.

쓰기에서 약간의 성능 저하가 있지만, 유일해야 하는 값이라면 정합성을 보장하기 위해 UNIQUE를 사용하는 것이 좋다.