데이터베이스 따라잡기

정규화

meellon 2026. 6. 21. 06:30

학습 목표

함수 종속(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_nameproduct_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 개요

BCNFX → Y이면 X가 슈퍼키여야 한다. 3NF보다 엄격.

  • 대부분의 실무 스키마는 3NF 또는 BCNF에서 멈춘다
  • BCNF 분해가 종속 보존을 깨는 예외는 교재에서 별도 케이스로 다룬다

4NF다치 종속(multivalued dependency) 제거

  • 예: 한 교수가 여러 과목·여러 논문 주제를 독립적으로 여러 개 가짐
  • professor →→ courses, professor →→ topicsteaches, 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