자연 키와 대리 키의 선택은 설계 철학만의 문제가 아니라, 성능에도 직접적인 영향을 준다.
인덱스 입장에서 보면:
예를 들어, 다음 두 설계를 비교해 보자.
-- 자연 키 기반 PK
CREATE TABLE member (
email VARCHAR(255) PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
order_id BIGINT AUTO_INCREMENT PRIMARY KEY,
member_email VARCHAR(255) NOT NULL,
order_dt DATETIME NOT NULL,
CONSTRAINT fk_orders_member
FOREIGN KEY (member_email) REFERENCES member(email)
);
-- 대리 키 기반 PK
CREATE TABLE member (
member_id BIGINT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
order_id BIGINT AUTO_INCREMENT PRIMARY KEY,
member_id BIGINT NOT NULL,
order_dt DATETIME NOT NULL,
CONSTRAINT fk_orders_member
FOREIGN KEY (member_id) REFERENCES member(member_id)
);
두 설계 모두 기능적으로는 같다. 하지만 아래 차이가 발생한다.
데이터가 수십만, 수백만 건 이상으로 커질수록 이 차이는 곧 성능 차이로 이어진다.
자연 키 하나로는 유일하지 않아서, 다음과 같이 복합 자연 키를 PK로 잡는 경우도 많다.
-- 상영 영화 좌석 예시
CREATE TABLE reservation (
movie_title VARCHAR(200) NOT NULL,
screening_dt DATETIME NOT NULL,
seat_number VARCHAR(10) NOT NULL,
customer_id BIGINT NOT NULL,
PRIMARY KEY (movie_title, screening_dt, seat_number)
);
이렇게 설계하면 다음과 같은 문제가 생긴다.