학습 목표
함수 종속(functional dependency) 을 읽고 스키마 문제를 짚을 수 있다.
1NF, 2NF, 3NF, BCNF 위반 사례를 구분할 수 있다.
정규화가 중복·이상(anomaly) 을 줄이는 이유를 설명할 수 있다.
역정규화를 언제·왜 하는지 트레이드오프로 설명할 수 있다.
문제 상황
employees테이블에 부서명·부서 건물까지 한 줄에 있다- 부서 이전 시 수백 행을 같은 값으로 UPDATE
- 부서 없는 신규 직원은 부서 정보를 넣을 곳이 없다 (삽입 이상)
- 마지막 직원이 나가면 부서 메타데이터가 사라진다 (삭제 이상)
courses컬럼을course1,course2,course3으로 늘린다- 수강 과목 수마다 컬럼 추가 마이그레이션이 반복된다
- "일단 한 테이블에 다 넣자"가 빠르지만
- 6개월 뒤 조인 없는 보고서도 느리고, 데이터는 서로 어긋난다
관계형 모델·SQL을 봤다. 이번 편은 스키마를 어떻게 쪼개야 하는지의 규칙이다.
1. 왜 정규화하는가
정규화는 릴레이션을 더 작은 릴레이션으로 분해해 이상을 줄이는 설계 기법이다.
| 이상 | 증상 | 원인 |
|---|---|---|
| 삽입 | 사실을 넣으려면 없는 다른 사실도 필요 | 종속 정보가 한 테이블에 섞임 |
| 갱신 | 한 사실 변경에 여러 행 수정 | 중복 저장 |
| 삭제 | 한 행 삭제로 무관한 사실 소실 | 여러 개념이 한 행에 공존 |
- 정규화는 성능을 항상 올리지는 않는다
- 조인이 늘 수 있다 → 읽기 패턴에 따라 역정규화를 검토
2. 함수 종속 (FD)
함수 종속 — X → Y: X 값이 같으면 Y 값도 항상 같다.
dept_id → dept_name, dept_building
emp_id → emp_name, dept_id

- 슈퍼키 — 행을 유일하게 식별하는 속성 집합
- 후보키 — 최소 슈퍼키
- 기본키 — 선택된 후보키
- FD는 "비즈니스 규칙"이다
- "직원은 한 부서에만 속한다" →
emp_id → dept_id - 잘못된 FD 가정이면 잘못 분해된다
- "직원은 한 부서에만 속한다" →
3. 1NF — 원자값
1NF: 각 컬럼은 더 쪼갤 수 없는(atomic) 값만, 반복 그룹 없음.
위반 예
| student_id | name | courses |
|---|---|---|
| 1 | alice | Math, Physics |
1NF로
| student_id | name |
|---|---|
| 1 | alice |
| student_id | course |
|---|---|
| 1 | Math |
| 1 | Physics |
- JSON 배열 컬럼도 설계 관점에서는 1NF 위반에 가깝게 본다
- 쿼리·제약·인덱스가 어려워진다
4. 2NF — 부분 종속 제거
2NF: 1NF이고, 복합 기본키의 일부에만 종속되는 비주요 속성이 없다.
위반 예 — (order_id, product_id) → qty, product_name
product_name은product_id만으로 결정 → 부분 종속
분해
order_items(order_id, product_id, qty)products(product_id, product_name)
5. 3NF — 이행 종속 제거
3NF: 2NF이고, 비주요 속성이 다른 비주요 속성에 종속되지 않는다 (이행 종속 없음).
위반 예 — employees(emp_id, emp_name, dept_id, dept_name, dept_building)
emp_id → dept_id → dept_name, dept_building(이행 종속)
분해
employees(emp_id, emp_name, dept_id)departments(dept_id, dept_name, dept_building)

| 정규형 | 한 줄 요약 |
|---|---|
| 1NF | 반복·다중값 제거 |
| 2NF | 복합키 부분 종속 제거 |
| 3NF | 비주요 속성 간 이행 종속 제거 |
| BCNF | 모든 FD의 결정자가 후보키 |
6. BCNF와 4NF 개요
BCNF — X → Y이면 X가 슈퍼키여야 한다. 3NF보다 엄격.
- 대부분의 실무 스키마는 3NF 또는 BCNF에서 멈춘다
- BCNF 분해가 종속 보존을 깨는 예외는 교재에서 별도 케이스로 다룬다
4NF — 다치 종속(multivalued dependency) 제거
- 예: 한 교수가 여러 과목·여러 논문 주제를 독립적으로 여러 개 가짐
professor →→ courses,professor →→ topics→teaches,research_topics로 분리
실무 OLTP 스키마 설계에서 4NF까지 매번 가지는 않지만, M:N을 중간 테이블 없이 한 릴레이션에 우겨 넣는 패턴을 짚을 때 유용하다.
7. 역정규화 트레이드오프
정규화는 쓰기 일관성·중복 최소에 유리하고, 읽기는 조인 비용이 든다.

| 상황 | 선택 | 이유 |
|---|---|---|
| 주문·결제 OLTP | 3NF 유지 | 갱신 이상 비용이 큼 |
| 대시보드 집계 | 요약 테이블·물질화 뷰 | 읽기 latency |
| 이벤트 로그 | append-only wide row | 스키마 유연·순서 보존 |
| 읽기 100:1 보고서 | 중복 컬럼·캐시 테이블 | 조인 제거 |
- 역정규화 시 갱신 경로를 명시한다
- 트리거, 배치 동기화, CDC로 파생 테이블 맞춤
- "조인이 느려서"만으로 역정규화하면 갱신 버그가 쌓인다
- 먼저 인덱스·실행 계획(이후 편)을 본다
8. 정리
- 정규화는 FD 기반 분해로 삽입·갱신·삭제 이상을 줄인다
- 1NF(원자값) → 2NF(부분 종속) → 3NF(이행 종속) → BCNF 순으로 기억
- 실무는 3NF/BCNF + 필요한 역정규화가 흔하다
- 역정규화는 읽기 최적화이고, 일관성 유지 비용을 함께 설계한다
다음에 다룰 것
- 쿼리 처리 개요
- SQL 파싱, 검증, 최적화, 실행 파이프라인
해당 내용은 Database System Concepts, 7/E (Silberschatz, Korth, Sudarshan) 의 내용을 기반으로 합니다.
'데이터베이스 따라잡기' 카테고리의 다른 글
| 디스크와 페이지 (0) | 2026.06.23 |
|---|---|
| 쿼리 처리 개요 (0) | 2026.06.22 |
| SQL 기초 (0) | 2026.06.20 |
| 관계형 모델 (0) | 2026.06.19 |
| 데이터베이스 오리엔테이션 (0) | 2026.06.18 |