본문으로 바로가기

데이터베이스 정규화 — 1NF부터 5NF까지

다중값이 낀 주문 테이블을 1NF→2NF→3NF로 실제 분해하며 갱신 이상이 사라지는 것을 보여주고, BCNF·4NF·5NF는 위반 사례로 감각을 잡는다.

1 / 9주문 기록을 한 장에 다 적은 테이블 — 편해 보이지만 다중값이 셀에 끼어 있습니다. 정규화는 이 한 장을 '사실 하나당 한 곳'으로 다듬는 단계들입니다.
0NF1NF이상2NF3NFBCNF4NF5NF
주문 (비정규)
주문ID고객전화상품들
1김미소010-1111연필, 지우개
2박바다010-2222연필
단계 목록 · 키보드 ←/→ 이동, Space 재생

정규화의 목적은 하나 — '사실 하나당 한 곳'. 같은 사실이 두 곳에 적히는 순간 갱신·삽입·삭제 이상이 생기고, 각 정규형은 중복이 숨어드는 통로(다중값→부분 종속→이행 종속→다치 종속→조인 종속)를 하나씩 막는다.

왜 헷갈리는가

정규형 정의를 암기하다 길을 잃는다 — '키에, 키 전체에(2NF), 키에만(3NF) 종속'이라는 한 문장과, 각 단계가 막는 사고가 무엇인지가 본체다. 그리고 'NoSQL/분석계는 정규화 안 한다'는 반쪽 진실 — 그건 정규화를 모르는 게 아니라 알고서 의도적으로 어기는 것(반정규화)이다.

애니메이션이 보여주는 것

1NF(셀은 원자값)로 만들자마자 중복이 눈에 보인다 — 김미소의 전화가 두 행, 연필 가격이 두 행. 전화를 바꾸려면 두 행을 다 고쳐야 하고 하나만 고치면 장부가 모순된다(갱신 이상). 2NF가 '복합 키의 일부에만 매달린 사실'(상품→가격)을, 3NF가 '키 아닌 것에 매달린 사실'(고객→전화)을 각자의 테이블로 보낸다.

그 너머는 희귀 통로다. BCNF는 결정자가 후보 키가 아닌 틈, 4NF는 독립 다중값 두 개가 만드는 조합 폭발(2×2=4행), 5NF는 셋 이상 관계의 조인 종속. 실무 스키마의 종착역은 대개 3NF/BCNF다.

실무 감각

정규화를 다루는 현장의 규칙.

  • OLTP(쓰기 많은 운영계): 3NF/BCNF 기본 — 이상 현상은 곧 데이터 버그다.
  • OLAP(분석계): 스타 스키마처럼 의도적 반정규화 — 조인 비용을 읽기 성능과 바꾼다. 원본이 정규형이어야 안전하게 어긴다.
  • 반정규화는 '캐시된 계산'이다: 주문 테이블의 총액 컬럼, 게시글의 댓글 수 — 갱신 시점 동기화 책임이 따라온다(트리거·배치·이벤트).
  • JSON 컬럼·문서 DB의 내장(embedding)은 1NF 위반이 아니라 '함께 읽는 단위'의 선택 — 단, 그 안의 사실이 다른 곳에도 적히면 같은 이상 현상이 돌아온다.

기억할 것

  • 목적은 '사실 하나당 한 곳' — 정규형 번호는 그 통로를 막는 순서다.
  • 주문(呪文): 키에(1NF+), 키 전체에(2NF), 키에만(3NF) 종속.
  • 실무 종착역은 3NF/BCNF — 4NF·5NF는 위반 패턴만 알아봐도 충분하다.
  • 반정규화는 정규화의 반대말이 아니라, 알고서 지불하는 성능 거래다.
데이터베이스 정규화 — 1NF부터 5NF까지 | KIE