데이터베이스를 설계할 때 Primary Key(기본 키) 설정은 매우 중요한 결정 중 하나입니다.
많은 개발자들이 단일 컬럼으로 구성된 기본 키에 익숙하지만, 실제 업무에서는 여러 컬럼을 조합한 **복합 기본 키(Composite Primary Key)**가 필요한 경우가 빈번하게 발생합니다.
오늘은 왜 복합 기본 키를 사용해야 하는지, 그리고 어떤 상황에서 활용하면 좋은지에 대해 자세히 알아보겠습니다.
복합 기본 키 (Composite Primary Key) 란?
복합 기본 키는 두 개 이상의 컬럼을 조합하여 하나의 기본 키로 사용하는 방식입니다. 각 개별 컬럼은 중복된 값을 가질 수 있지만, 모든 컬럼의 값을 조합했을 때는 테이블 내에서 유일해야 합니다.
-- 복합 기본 키 예시
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
price DECIMAL(10,2),
PRIMARY KEY (order_id, product_id)
);
위 예시에서 order_id와 product_id는 각각 중복될 수 있지만, 두 값의 조합은 테이블 내에서 유일해야 합니다.
복합 기본 키를 사용하는 주요 이유
1. 비즈니스 로직의 자연스러운 반영
실제 비즈니스에서는 단일 속성만으로는 데이터의 고유성을 보장할 수 없는 경우가 많습니다.
예시: 온라인 쇼핑몰의 주문 상품 테이블
- 하나의 주문(order_id)에는 여러 상품이 포함될 수 있음
- 하나의 상품(product_id)은 여러 주문에 포함될 수 있음
- 하지만 특정 주문의 특정 상품은 유일해야 함
하지만 특정 주문의 특정 상품은 유일해야 함
이런 경우 (order_id, product_id) 조합이 자연스러운 기본 키가 됩니다.
2. 데이터 무결성 보장
복합 기본 키는 데이터베이스 레벨에서 비즈니스 규칙을 강제할 수 있는 강력한 도구입니다.
예시: 방송 광고 데이터 테이블
CREATE TABLE broadcast_ads (
ad_no INT,
channel_id INT,
broadcast_date DATE,
time_slot VARCHAR(10),
duration INT,
PRIMARY KEY (ad_no, channel_id, broadcast_date, time_slot)
);
이 구조는 "동일한 광고가 같은 채널, 같은 날짜, 같은 시간대에 중복으로 방송될 수 없다"는 비즈니스 규칙을 자동으로 보장합니다.
3. 성능 최적화
복합 기본 키는 자동으로 인덱스를 생성하므로, 해당 컬럼들을 조건으로 하는 쿼리의 성능을 크게 향상시킵니다.
-- 이런 쿼리가 매우 빠르게 실행됩니다
SELECT * FROM broadcast_ads
WHERE ad_no = 12345 AND channel_id = 6 AND broadcast_date = '2025-06-18';
4. 저장 공간 효율성
별도의 대리 키(Surrogate Key)를 생성하지 않아도 되므로, 추가적인 저장 공간과 인덱스 오버헤드를 줄일 수 있습니다.
복합 기본 키 설계 시 고려사항
1. 컬럼 순서의 중요성
복합 기본 키에서 컬럼의 순서는 인덱스 성능에 직접적인 영향을 미칩니다.
-- 좋은 예: 선택도가 높은 컬럼을 앞에 배치
PRIMARY KEY (user_id, order_date, product_id)
-- 나쁜 예: 선택도가 낮은 컬럼을 앞에 배치
PRIMARY KEY (status, user_id, order_date, product_id)
권장사항:
- 가장 자주 조회 조건으로 사용되는 컬럼을 앞에 배치
- 값의 분포도(Cardinality)가 높은 컬럼을 우선 배치
2. 컬럼 개수 제한
복합 기본 키에 포함되는 컬럼이 너무 많으면 성능상 불리할 수 있습니다.
권장사항:
- 일반적으로 3-5개 컬럼 이내로 제한
- 꼭 필요한 컬럼만 포함
- 6개 이상이 필요하다면 설계 재검토 고려
3. 데이터 타입 고려
기본 키에 포함되는 컬럼은 가능한 한 고정 길이 데이터 타입을 사용하는 것이 좋습니다.
-- 좋은 예
PRIMARY KEY (user_id, product_id, order_date) -- INT, INT, DATE
-- 피해야 할 예
PRIMARY KEY (user_name, product_name, order_datetime) -- VARCHAR, VARCHAR, TIMESTAMP
복합 기본 키는 단순히 기술적인 선택이 아닌, 비즈니스 로직을 데이터베이스 구조에 자연스럽게 반영하는 중요한 설계 도구입니다. 올바르게 설계된 복합 기본 키는 데이터 무결성을 보장하고, 성능을 향상시키며, 코드의 복잡성을 줄일 수 있습니다.
다만, 복합 기본 키를 도입하기 전에는 반드시 비즈니스 요구사항을 명확히 분석하고, 향후 확장성과 유지보수성을 충분히 고려해야 합니다. 적절한 상황에서 올바르게 사용된다면, 복합 기본 키는 견고하고 효율적인 데이터베이스 설계의 핵심 요소가 될 것입니다.
'Study > Database' 카테고리의 다른 글
PostgreSQL에서의 쿼리문 변수 사용법 (0) | 2025.04.11 |
---|---|
PostgreSQL의 명시적 형변환 (0) | 2025.04.10 |
<selectKey>의 활용법 (0) | 2024.10.03 |
SQL JOIN의 이해 (1) | 2024.10.02 |
Oracle에서 기본으로 제공하는 DD(Data Dictionary) (0) | 2024.08.19 |