데이터베이스 키 (Key)의 종류
한눈에 보기
데이터베이스 키는 행을 유일하게 식별하거나 테이블 간 관계를 표현하는 속성 집합이다. 유일성과 최소성을 기준으로 슈퍼키, 후보키, 기본키, 대체키, 외래키를 구분하고 자연키와 대리키 선택 기준까지 정리한다.
최종 업데이트 2026.09.17
데이터베이스에서 키(Key)는 테이블의 행을 유일하게 식별하거나 테이블 사이의 관계를 표현하기 위해 사용하는 속성 또는 속성들의 집합이다. 슈퍼키, 후보키, 기본키, 대체키, 외래키가 대표적인 종류이며, 각각 유일성과 최소성이라는 두 가지 성질을 기준으로 구분된다.
키를 이해하는 두 가지 기준
키의 종류를 구분하는 핵심 개념은 유일성(Uniqueness)과 최소성(Minimality)이다. 유일성은 그 키 값으로 테이블의 모든 행을 서로 구별할 수 있다는 성질이고, 최소성은 행을 구별하는 데 꼭 필요한 속성만 포함하고 있어서 하나라도 빼면 유일성이 깨진다는 성질이다. 예를 들어 (주민등록번호, 이름) 조합은 행을 유일하게 구별하므로 유일성은 만족하지만, 이름을 빼고 주민등록번호만으로도 구별이 가능하므로 최소성은 만족하지 못한다.
키의 종류
슈퍼키(Super Key)
유일성만 만족하면 되는 가장 넓은 개념의 키다. 행을 구별할 수만 있다면 불필요한 속성이 섞여 있어도 슈퍼키가 된다. 학생 테이블에서 (학번), (학번, 이름), (학번, 이름, 전공) 모두 슈퍼키다.
후보키(Candidate Key)
슈퍼키 중에서 최소성까지 만족하는 키다. 즉 기본키가 될 자격이 있는 후보들이다. 학생 테이블에서 학번과 주민등록번호가 각각 행을 유일하게 식별한다면 둘 다 후보키다. 후보키는 널(NULL) 값을 가질 수 없고 중복될 수 없다.
기본키(Primary Key)
후보키 중에서 설계자가 대표로 선택한 하나의 키다. 테이블당 하나만 존재하며, 널을 허용하지 않고 중복을 허용하지 않는다는 제약이 데이터베이스 수준에서 강제된다. 대부분의 데이터베이스는 기본키에 자동으로 인덱스를 생성하며, MySQL InnoDB처럼 기본키 순서로 데이터를 물리적으로 저장하는 경우도 있으므로 짧고 변하지 않는 값을 고르는 것이 좋다.
대체키(Alternate Key)
후보키 중에서 기본키로 선택되지 못한 나머지 키다. 학번을 기본키로 선택했다면 주민등록번호는 대체키가 된다. 보통 유니크(UNIQUE) 제약 조건으로 중복을 막아 관리한다.
외래키(Foreign Key)
다른 테이블의 기본키(또는 유니크 키)를 참조하는 속성으로, 테이블 간의 관계를 표현한다. 외래키는 참조하는 테이블에 존재하는 값이거나 널이어야 하며, 이 규칙을 참조 무결성(Referential Integrity)이라고 한다. 참조되는 행이 삭제될 때의 동작은 ON DELETE CASCADE, SET NULL, RESTRICT 같은 옵션으로 지정한다.
복합키(Composite Key)
두 개 이상의 속성을 묶어 만든 키다. 수강 테이블에서 (학번, 과목코드)처럼 단일 속성으로는 행을 구별할 수 없을 때 사용한다.
종류별 비교
| 키 | 유일성 | 최소성 | 널 허용 | 테이블당 개수 |
|---|---|---|---|---|
| 슈퍼키 | 만족 | 불필요 | 정의상 제약 없음 | 여러 개 |
| 후보키 | 만족 | 만족 | 불허 | 여러 개 |
| 기본키 | 만족 | 만족 | 불허 | 1개 |
| 대체키 | 만족 | 만족 | 불허 | 여러 개 가능 |
| 외래키 | 불필요 | 불필요 | 허용 가능 | 여러 개 |
자연키와 대리키
기본키를 고를 때는 자연키(Natural Key)와 대리키(Surrogate Key) 중 무엇을 쓸지도 결정해야 한다. 자연키는 주민등록번호나 이메일처럼 업무적으로 의미 있는 값을 그대로 키로 쓰는 방식이고, 대리키는 자동 증가 번호(Auto Increment)나 유유아이디(UUID)처럼 업무와 무관한 인공 값을 키로 쓰는 방식이다.
자연키는 직관적이지만 업무 규칙이 바뀌면 키 값이 변할 수 있고, 개인정보가 키에 노출될 위험도 있다. 실무에서는 값이 절대 변하지 않고 짧은 대리키를 기본키로 두고, 자연키에는 유니크 제약을 거는 방식이 널리 쓰인다. 분산 환경에서 아이디 충돌을 피해야 한다면 유유아이디나 스노플레이크(Snowflake) 방식의 아이디를 고려한다.
예시로 보는 키 정의
CREATE TABLE student (
student_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 기본키(대리키)
email VARCHAR(100) NOT NULL UNIQUE, -- 대체키(자연키)
name VARCHAR(50) NOT NULL
);
CREATE TABLE enrollment (
student_id BIGINT NOT NULL,
course_code VARCHAR(10) NOT NULL,
grade CHAR(1),
PRIMARY KEY (student_id, course_code), -- 복합키
FOREIGN KEY (student_id) REFERENCES student (student_id)
ON DELETE CASCADE -- 외래키와 참조 무결성
);
면접에서 이렇게 물어본다
- 슈퍼키, 후보키, 기본키의 관계를 유일성과 최소성 개념으로 설명해 보라.
- 기본키와 유니크 제약 조건의 차이는 무엇인가.
- 외래키가 보장하는 무결성은 무엇이고, 참조 대상 행이 삭제될 때의 처리 옵션에는 어떤 것이 있는가.
- 자연키 대신 대리키를 기본키로 쓰는 이유는 무엇인가.
- 기본키로 UUID를 쓸 때의 장점과 성능상 단점을 설명해 보라.
데이터베이스에서 같이 읽기
- 이상 현상 (Anomaly)이상 현상은 테이블 설계가 잘못되어 삽입, 갱신, 삭제 과정에서 데이터 불일치나 손실이 생기는 현상이다. 삽입, 갱신, 삭제 이상의 세 종류와 원인인 함수 종속, 해결책인 정규화까지 예시와 함께 정리한다.
- 데이터베이스 커넥션 풀 (Database Connection Pool)데이터베이스 연결을 미리 만들어 재사용하는 커넥션 풀의 동작 원리와 필요성을 다룬다. HikariCP 설정, 풀 크기 계산, 타임아웃과 고갈 문제를 실무 관점에서 정리했다.
- 인덱스 (Index)인덱스는 컬럼 값과 저장 위치를 별도 자료구조로 정리해 검색 속도를 높이는 장치다. B+Tree 동작 원리, 클러스터드와 논클러스터드 비교, 복합 인덱스와 커버링 인덱스, 설계 시 주의점을 다룬다.
- 데이터베이스 레플리케이션 (Database Replication)원본 데이터베이스의 변경을 레플리카에 복제해 읽기 부하와 장애를 분산하는 구조를 다룬다. 동기와 비동기 복제, 복제 지연, 읽기 일관성과 장애 전환을 정리했다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기