데이터베이스 설계 모범 사례
핵심 요약
한 줄 요약: 스키마는 도메인 불변조건이 먼저입니다. 정규화·인덱스·파티셔닝은 그 다음이며, 리워드·이벤트처럼 다중 테넌트·멱등 키를 빼먹으면 나중에 마이그레이션 비용이 큽니다.
| 단계 | 산출물 |
|---|---|
| 도메인 모델 | 용어집·ERD 초안 |
| 제약 | FK·UNIQUE·CHECK |
소개
DB 스키마를 나중에 바꾸려면 마이그레이션·다운타임 부담이 커집니다. 리워드·이벤트·사용자 데이터를 다루면서 정규화·인덱스·관계 설계를 잘못했다가 고친 경험이 있어, 그때 기준으로 “미리 해두면 좋은” 설계 사례를 정리했습니다.
정규화 (Normalization)
정규화는 데이터 중복을 제거하고 데이터 무결성을 보장하는 핵심 기법입니다.
제1정규형 (1NF)
각 컬럼은 원자값(atomic value)만을 가져야 합니다.
제2정규형 (2NF)
부분 함수 종속을 제거합니다.
제3정규형 (3NF)
이행적 종속을 제거합니다.
인덱싱 전략
인덱스는 쿼리 성능을 크게 향상시킬 수 있지만, 잘못 사용하면 쓰기 성능을 저하시킬 수 있습니다.
기본 인덱싱
인덱스 선택 가이드
- WHERE 절에서 자주 사용되는 컬럼
- JOIN 조건에 사용되는 컬럼
- ORDER BY나 GROUP BY에 사용되는 컬럼
- 카디널리티가 높은 컬럼 (고유 값이 많은 컬럼)
복합 인덱스 순서
복합 인덱스의 컬럼 순서는 중요합니다. 가장 선택적인(카디널리티가 높은) 컬럼을 앞에 배치합니다.
관계 설계
일대다 (One-to-Many)
가장 일반적인 관계입니다.
다대다 (Many-to-Many)
중간 테이블(join table)을 사용합니다.
일대일 (One-to-One)
데이터 타입 선택
적절한 데이터 타입 선택은 저장 공간과 성능에 영향을 미칩니다.
숫자 타입
문자열 타입
날짜/시간 타입
제약 조건 (Constraints)
제약 조건은 데이터 무결성을 보장합니다.
기본 키 (Primary Key)
외래 키 (Foreign Key)
체크 제약 조건 (Check Constraint)
고유 제약 조건 (Unique Constraint)
성능 최적화
파티셔닝
대용량 테이블을 여러 파티션으로 분할합니다.
쿼리 최적화
보안 고려사항
SQL Injection 방지
권한 관리
모니터링 및 유지보수
느린 쿼리 로깅
통계 정보 업데이트
결론
효율적인 데이터베이스 설계를 위해 다음 원칙을 따릅니다:
- 정규화: 데이터 중복 제거 및 무결성 보장
- 적절한 인덱싱: 쿼리 성능 향상
- 올바른 데이터 타입: 저장 공간 및 성능 최적화
- 제약 조건 활용: 데이터 무결성 보장
- 성능 모니터링: 지속적인 최적화
이러한 모범 사례를 따르면 확장 가능하고 유지보수하기 쉬운 데이터베이스를 구축할 수 있습니다.