중복과 잘못된 종속을 제거해 갱신 이상을 막는 설계 과정.
무엇을 막는가 — 세 가지 이상현상
정규화가 안 된 테이블을 보자.
주문번호 | 회원ID | 회원이름 | 회원등급 | 상품 | 수량
1 | 100 | 김철수 | GOLD | 노트북 | 1
2 | 100 | 김철수 | GOLD | 마우스 | 2
3 | 200 | 이영희 | SILVER | 키보드 | 1
| 이상 | 무슨 일이 | 예 |
|---|---|---|
| 갱신 이상 | 같은 사실이 여러 곳에 → 일부만 고쳐짐 | 김철수 등급을 VIP로 바꿀 때 1번 행만 고치면 데이터가 모순 |
| 삽입 이상 | 불필요한 값 없이는 행을 못 넣음 | 아직 주문 안 한 회원을 등록할 수 없다 |
| 삭제 이상 | 지우면 관계없는 정보까지 사라짐 | 3번 주문을 지우면 이영희 정보가 통째로 사라진다 |
근본 원인은 하나 — 한 테이블에 서로 다른 주제(주문과 회원)가 섞여 있다.
단계
| 단계 | 제거 대상 | 뜻 |
|---|---|---|
| 1NF | 다중값 속성 | 한 칸에 값 하나만 ("서울, 부산" ✗) |
| 2NF | 부분 함수 종속 | 복합키의 일부에만 종속되는 컬럼 분리 |
| 3NF | 이행적 종속 | A→B→C 에서 C를 분리 |
| BCNF | 결정자가 후보키가 아닌 경우 | 3NF의 예외 상황 정리 |
함수 종속이란 "A를 알면 B가 결정된다"는 관계다(회원ID → 회원이름).
정규화는 이 종속 관계를 정리해 각 테이블이 하나의 주제만 갖게 만드는 일이다.
위 예를 정규화하면
주문(주문번호, 회원ID, 상품, 수량) 회원(회원ID, 회원이름, 회원등급) 등급을 바꾸려면 회원 테이블 한 행만 고치면 된다. 이상현상이 사라진다.
대가
테이블이 쪼개지므로 조인이 늘어난다. 조회가 압도적으로 많은 시스템에서는 조인 비용이 병목이 될 수 있다.
면접 답변 골격
"정규화를 기본으로 설계하고, 측정한 병목에만 반정규화를 적용합니다. 처음부터 성능을 걱정해 중복을 두면 정합성 유지 책임을 애플리케이션이 전부 떠안게 되고, 그게 더 비쌉니다."
실무에서 3NF까지가 일반적이고 BCNF 이상은 잘 가지 않는다.