[DB/SQL] 복합키/대체키 PK 지정과 성능

songeunm·2025년 5월 31일

DB & SQL

목록 보기
16/27

데이터들을 보다 보면 복합키로 PK를 구성할 수 있음에도 ID 컬럼을 만들어 사용하는 경우를 자주 확인할 수 있다.

왜 이렇게 사용하는걸까? 장점이 뭘까??

🎱 Composite Key (복합키)

  • 두 개 이상의 칼럼으로 구성된 기본키
CREATE TABLE Enrollments_NaturalKey (
    StudentId VARCHAR(10),      -- 학번
    CourseCode VARCHAR(10),     -- 과목 코드
    Semester VARCHAR(6),        -- 예: '2024F'

    Grade CHAR(2),              -- 성적 (예: A+, B0)

    PRIMARY KEY (StudentId, CourseCode, Semester)
);

🎱 Surrogate Key (대체키)

  • 의미 없는 고유 ID를 인위적으로 부여한 키
  • ex) 단순 증가 숫자, UUID
CREATE TABLE Enrollments_SurrogateKey (
    EnrollmentId INT AUTO_INCREMENT PRIMARY KEY,  -- Surrogate Key

    StudentId VARCHAR(10),
    CourseCode VARCHAR(10),
    Semester VARCHAR(6),
    Grade CHAR(2),

    UNIQUE (StudentId, CourseCode, Semester)      -- 유일성은 따로 관리
);

🎱 Composite Key vs. Surrogate Key

⚽️ PK 인덱스 구조

RDBMS는 PK에 자동으로 클러스터형 B-Tree 인덱스를 생성
➡️ 데이터를 정렬해서 저장하고, 검색 시 빠르게 찾도록 함

  • Composite Key
    • 인덱스 노드 크기 큼 (데이터가 큼)
  • Surrogate Key
    • 인덱스 노드 크기 작음 (데이터 작음(정수))
    • 인덱스 구조 단순

⚽️ 비교 성능

  • Composite Key
    • 비교 연산 복잡 (정렬 비용 큼)
  • Surrogate Key
    • 비교가 빠르고 정렬이 쉬움

⚽️ 확장성

  • Composite Key
    • 이를 참조하는 테이블도 모두 복합 FK를 가져야 함
  • Surrogate Key
    • 단일 FK

⚽️ JOIN / FOREIGN KEY

  • Composite Key
    • SQL 쿼리 복잡도 증가
    • Join 조건 길어짐, 성능 저하
  • Surrogate Key
    • JOIN 조건이 훨씬 간단, 빠름

⚽️ 관리

  • Composite Key
    • 변경 가능성이 있는 컬럼을 PK로 삼을 경우, 데이터 변경시 영향 큼
  • Surrogate Key ✅
    • 데이터 변경에도 안정적
    • 대신, 마이그레이션 시 충돌 가능성 (여러 시스템 또는 환경에서 각각 생성된 ID 값이 겹칠 수 있음)

⚽️ 무결성 보장

  • Composite Key
    • PK 자체가 유일성을 보장
  • Surrogate Key
    • Unique 제약을 통해 별도 관리 필요

⚽️ 데이터의 의미

  • Composite Key
    • PK를 통해 데이터 파악 가능
  • Surrogate Key
    • PK를 통해 데이터 파악 불가능

✚ UUID (Universally Unique Identifier)

  • 전 세계적으로 절대 중복되지 않도록 설계된 고유 ID
  • 문자열처럼 생긴 128비트 값
  • 장점
    • 각 시스템/서버/프로세스가 서로 독립적으로 생성해도 중복이 거의 없음 (ID 충돌 방지)
    • 마이그레이션, 분산 시스템에 유리
  • 단점
    • 성능 느림 (UUID는 정렬되지 않음)
    • 저장 공간 큼 (INT→4byte, UUID→보통 16byte 이상)
    • 인덱스 크기 큼
  • 사용 경우
    • 마이그레이션이 잦은 경우
    • 여러 시스템이 동시에 ID를 발급해야 하는 경우

🎱 결론

Surrogate Key 또한 단점이 있으나, 성능·관리 측면에서 Composite Key보다 좋기 때문에
작고 단순한 테이블에서는 Composite Key로도 충분하지만,
중대형 시스템 / 다수 JOIN / 외래키 많은 경우에는 Surrogate Key를 적극 사용하는 것이 좋다!

profile
데굴데굴 구르는 개발자 지망생

0개의 댓글