본문 바로가기
데이터

데이터베이스 설계에서 효과적인 키(Key) 설정은

by 웨더맨 2025. 2. 21.
반응형

데이터베이스 설계에서 키(Key) 설정은 성능과 데이터 무결성에 큰 영향을 미칩니다. 키를 설정할 때 고려해야 할 중요한 요소들을 정리해보겠습니다.

 


1. 기본 키(Primary Key) 설정 시 고려 사항

기본 키는 각 행을 고유하게 식별하는 역할을 합니다.
✅ 고려해야 할 점:

  • 유일성(Unique): 중복되지 않아야 합니다.
  • 불변성(Immutable): 시간이 지나도 값이 변하지 않아야 합니다.
  • 단순성(Simple): 너무 많은 컬럼을 포함하면 성능에 악영향을 줄 수 있습니다.
  • 짧은 길이(Short Length): 인덱스 크기와 검색 성능을 고려해 너무 길지 않도록 합니다.
  • 자동 증가(Auto Increment) vs 자연 키(Natural Key) 선택
    • 일반적으로 **자동 증가 키(대리 키, Surrogate Key)**가 관리가 용이합니다.
    • 자연 키(Natural Key)를 사용할 경우, 변경 가능성과 속도를 신중하게 검토해야 합니다.

예시:

  • id (AUTO_INCREMENT) → 권장 ✅
  • 주민등록번호 (ssn) → 변경될 가능성이 있어 지양 ❌

2. 외래 키(Foreign Key) 설정 시 고려 사항

외래 키는 **참조 무결성(Referential Integrity)**을 유지하는 데 중요한 역할을 합니다.
✅ 고려해야 할 점:

  • 부모 테이블의 기본 키와 타입이 일치해야 합니다.
  • CASCADE 옵션 활용:
    • ON DELETE CASCADE: 부모 데이터 삭제 시 자식 데이터도 삭제
    • ON UPDATE CASCADE: 부모 데이터 변경 시 자식 데이터도 함께 변경
  • 필요하지 않다면 외래 키 제약을 생략하고 애플리케이션 레벨에서 관리하는 것도 고려
    • 트랜잭션이 많은 경우 성능 저하 가능성 존재
    • 외래 키 없이 인덱스 설정을 통해 성능 개선 가능

예시:

  • orders 테이블이 customers 테이블을 참조하는 경우:
    sql
    복사편집
    ALTER TABLE orders ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE;

3. 인덱스(Index) 최적화

키 설정 시, 인덱스의 역할을 함께 고려해야 합니다.
✅ 고려해야 할 점:

  • 기본 키(Primary Key)는 자동으로 클러스터형 인덱스(Clustered Index)가 생성됨
  • 외래 키(Foreign Key)에 대한 검색이 빈번하다면 별도 인덱스를 추가
  • 복합 키(Composite Key) 사용 시 주의
    • 자주 조회하는 컬럼을 앞쪽에 배치
    • 너무 많은 컬럼을 포함하면 인덱스 크기가 커져서 성능 저하 가능

예시:

  • (customer_id, order_date) 복합 키 → customer_id가 자주 조회되는 경우 먼저 배치
    sql
    복사편집
    CREATE INDEX idx_customer_order ON orders (customer_id, order_date);

4. 유니크 키(Unique Key) 활용

유니크 키는 특정 컬럼 값이 중복되지 않도록 보장합니다.
✅ 고려해야 할 점:

  • 이메일, 사용자명(username) 등은 유니크 키 적용
  • 기본 키가 아닌데도 유일성을 보장해야 하는 경우 활용

예시:

  • users 테이블에서 email을 유일하게 설정
    sql
    복사편집
    ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);

5. 자연 키(Natural Key) vs 대리 키(Surrogate Key) 선택

자연 키(Natural Key): 의미 있는 실제 데이터를 키로 사용
대리 키(Surrogate Key): AUTO_INCREMENT, UUID 같은 인공적인 키 사용

비교 항목자연 키 (Natural Key)대리 키 (Surrogate Key)

변경 가능성 변경될 가능성 높음 변경되지 않음
검색 성능 검색 시 인덱스 활용 별도 인덱스 필요
이해하기 쉬움 직관적 이해 가능 의미 없는 값이므로 직관적이지 않음
저장 공간 크기가 클 수 있음 일반적으로 작음

👉 일반적으로 대리 키(AUTO_INCREMENT)를 선호하지만, 상황에 따라 적절히 선택해야 합니다.

예시:

  • employees 테이블에서 employee_id (AUTO_INCREMENT) 사용 ✅
  • 이메일을 기본 키로 사용 ❌ (변경될 가능성이 있음)

6. 분산 시스템에서 키 충돌 방지

  • UUID (Universally Unique Identifier) 활용:
    • 글로벌 유니크 ID가 필요할 때 사용
    • MySQL에서는 UUID() 함수 사용 가능
    • 하지만, UUID는 길이가 길어 성능 저하 우려 있음
  • 샤딩(Sharding) 고려:
    • 여러 서버에서 같은 PK가 생성되지 않도록 분산 키(Distributed Key) 설계

예시:

  • MySQL에서 UUID를 기본 키로 설정하는 경우
    sql
    복사편집
    ALTER TABLE users ADD COLUMN id CHAR(36) PRIMARY KEY DEFAULT (UUID());

결론: 키 설정 시 핵심 체크리스트

기본 키(Primary Key)는 변경 가능성이 없는 유일한 값으로 설정
외래 키(Foreign Key)는 무결성을 유지하되 성능을 고려해 사용
인덱스(Index) 최적화로 검색 성능 개선
유니크 키(Unique Key)로 중복 데이터 방지
자연 키 vs 대리 키 선택 시 유지보수성과 성능 고려
대량 데이터 처리 및 분산 시스템에서는 UUID나 샤딩 고려

키를 잘 설계하면 데이터베이스 성능과 안정성이 크게 향상됩니다!

728x90
반응형

댓글