정규화 (1NF → BCNF)
정규화는 중복을 없애고 이상(anomaly)을 방지하는 체계입니다. 1NF~BCNF까지 각 단계가 풀어내는 "함수 종속"이 무엇인지 알면 시험 문제 절반이 풀립니다.
1NF2NF3NFBCNF 왜 정규화인가
한 테이블에 서로 다른 주제의 데이터가 섞이면 다음과 같은 문제가 발생합니다.
- 삽입 이상 — 부서 정보를 기록하려면 사원 한 명을 함께 넣어야 합니다
- 갱신 이상 — 부서 이름을 바꾸려면 그 부서 사원 행을 전부 UPDATE 해야 합니다
- 삭제 이상 — 마지막 사원을 지우면 부서 정보도 사라집니다
정규화는 이것을 막기 위해 테이블을 주제별로 쪼개는 규칙입니다.
함수 종속이라는 말
X → Y: X 값이 같으면 Y 값도 항상 같습니다
예: 사원번호 → 이름. 같은 사번은 항상 같은 이름을 가리킵니다. “사번이 이름을 결정한다”는 뜻으로 **사번은 결정자(determinant)**가 됩니다.
정규화의 각 단계는 특정 종류의 함수 종속을 제거합니다.
1NF — 원자값
모든 컬럼이 원자값 (쪼갤 수 없는 하나의 값)을 가집니다.
나쁜 예:
사원번호 | 취미
100 | 독서, 등산, 요리 ← 한 셀에 여러 값
좋은 예: 취미를 별도 행으로 분리합니다.
2NF — 부분 함수 종속 제거
복합키의 일부에만 의존하는 컬럼을 분리합니다.
예: 기본키 (주문번호, 상품번호) 인 테이블
주문번호 | 상품번호 | 수량 | 상품명 ← 상품명은 상품번호에만 의존!
상품명은 상품번호 → 상품명으로 복합키 일부에만 종속됩니다. 2NF 위반입니다.
→ (상품번호, 상품명)을 별도 상품 테이블로 분리합니다.
중요: 복합키가 없는 테이블(단일키)은 자동으로 2NF입니다.
3NF — 이행 함수 종속 제거
A → B → C 형태 (A→B, B→C)가 있으면, A와 C 사이에 이행 종속이 존재합니다.
예:
사원번호 | 부서번호 | 부서이름 ← 부서번호 → 부서이름 (이행 종속)
사원번호(PK) → 부서번호 → 부서이름. 부서이름은 사원번호에 간접적으로 종속됩니다.
→ (부서번호, 부서이름)을 부서 테이블로 분리합니다.
BCNF — 모든 결정자가 후보키
3NF보다 엄격합니다. 모든 함수 종속에서 결정자가 후보키여야 합니다.
예 (3NF지만 BCNF 위반):
학생 | 과목 | 교수 — (학생, 과목)이 PK
— 교수 → 과목 (한 교수가 한 과목만 가르침)
— 교수는 후보키가 아닌데 과목을 결정 → BCNF 위반
자주 출제되는 유의 사항
Q. “2NF 이면 1NF 이다”는 참인가요?
참입니다. 정규화는 단계적 포함 관계입니다. 2NF 만족이면 1NF도 만족합니다.
Q. 3NF 이면 BCNF 인가요?
거짓입니다. 3NF는 BCNF보다 약합니다. 위 예처럼 3NF인데 BCNF가 아닌 경우가 있습니다.
Q. 반정규화(denormalization)는 언제 하나요?
성능상 꼭 필요할 때만 합니다. 조인 비용이 너무 크거나 집계를 자주 할 때 고려합니다. 정규화 → 검증된 성능 문제 → 반정규화 순서입니다.
한 줄 요약 도표
| 단계 | 제거 대상 |
|---|---|
| 1NF | 비원자값 (반복 그룹) |
| 2NF | 부분 함수 종속 (복합키의 일부에만 의존) |
| 3NF | 이행 함수 종속 (A→B→C) |
| BCNF | 후보키가 아닌 결정자 |
2NF는 부분 종속, 3NF는 이행 종속, BCNF는 결정자를 봅니다.
이것을 기억하면 “다음 중 3NF로 가장 적절한 것은” 같은 문제를 빠르게 해결할 수 있습니다.