반응형
데이터베이스 설계에서 키(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
반응형
'데이터' 카테고리의 다른 글
DW, BI를 하다보면 듣게 되는 용어들 짤막한 이야기 (0) | 2023.12.12 |
---|---|
SSAS 큐브생성시 파티션 자동화 (0) | 2023.03.16 |
차원 모델링 뭘 고려해야할까 (0) | 2022.10.29 |
서브쿼리 주의하기 (0) | 2022.10.28 |
크로스 조인 (0) | 2022.10.28 |
댓글