본문 바로가기
Study/Database

왜 다중 Primary key를 사용할까? 제약조건에 PK를 여러개 지정해놓는 이유.

by 얏옹이 2025. 6. 18.
반응형

 

데이터베이스를 설계할 때 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