본문으로 건너뛰기
SQLD 준비실
이론 전체 목차 열기 5 / 32

데이터 모델링의 이해 · 정규화 5 / 32

정규화 (1NF → BCNF)

정규화는 중복을 없애고 이상(anomaly)을 방지하는 체계입니다. 1NF~BCNF까지 각 단계가 풀어내는 "함수 종속"이 무엇인지 알면 시험 문제 절반이 풀립니다.

출제 빈도 ★★★★★ 관련 문제 6개 | 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로 가장 적절한 것은” 같은 문제를 빠르게 해결할 수 있습니다.