sqld
정규화의 형태에대해 알아보자
자격증원톱
2026. 2. 20. 16:55
반응형
정규화의 형태에대해 알아보자
반응형

1) 1NF(제1정규형): “한 칸에는 값 1개”
핵심 규칙
- 속성(컬럼)은 하나의 값만 가져야 합니다.
- 한 컬럼에 “전화번호 2개”처럼 여러 값이 들어가면 1NF 위반입니다.
예시(전화번호)
(위반)
| 고객번호 | 이름 | 전화번호 |
| 31 | 홍길동 | 010-1234-1234, 010-1234-5678 |
(해결 1) 행으로 풀기
| 고객번호 | 이름 | 전화번호 |
| 31 | 홍길동 | 010-1234-1234 |
| 31 | 홍길동 | 010-1234-5678 |
그런데 이렇게 하면 이름이 중복되죠?
그래서 보통 더 깔끔하게는
(해결 2) 테이블 분리(정석)
- 고객(고객번호, 이름)
- 고객전화(고객번호, 전화번호순번, 전화번호)
2) 2NF(제2정규형): “부분 종속 제거”
핵심 규칙
- 1NF를 만족하면서,
- 일반 속성은 ‘전체 기본키’에 완전히 의존해야 합니다.
- 즉, 복합키(키가 2개 이상)일 때 한쪽 키에만 의존하는 컬럼이 있으면 2NF 위반입니다.
예시(주문내역)
주문내역 테이블의 키가 (주문번호, 상품번호)라고 해봅시다.
| 주문번호(PK) | 상품번호(PK) | 상품명 |
| O1 | P1 | 노트북 |
| O1 | P2 | 핸드폰 |
여기서 상품명은 상품번호만 알면 결정됩니다.
즉,
- 상품번호 → 상품명
이건 (주문번호, 상품번호) “전체”가 아니라 부분(상품번호)에 의존 → 부분 종속 → 2NF 위반
해결(분리)
- 주문내역(주문번호, 상품번호)
- 상품(상품번호, 상품명)
3) 3NF(제3정규형): “이행 종속 제거”
핵심 규칙
- 2NF를 만족하면서,
- 키가 아닌 속성이 다른 키 아닌 속성에 의존하면 안 됨
- 즉, “A(키) → B(일반) → C(일반)” 같은 연쇄 의존(이행 종속)을 제거합니다.
예시(주문 테이블에 고객등급이 같이 있는 경우)
| 주문번호(PK) | 고객번호 | 고객등급 ID | 고객등급명 |
| C | 1234 | 1 | VIP1 |
의존 관계를 보면
- 고객번호 → 고객등급ID
- 고객등급ID → 고객등급명
그래서 결과적으로 고객번호 → 고객등급명(간접)
이게 이행 종속이라 3NF 위반입니다.
해결(분리)
- 주문(주문번호, 고객번호)
- 고객(고객번호, 고객등급ID)
- 고객등급(고객등급ID, 고객등급명)
4) 2NF/3NF를 안 하면 생기는 대표 문제(이상 현상)
이미지에 나온 요지는 “중복 때문에 꼬인다”입니다.
- 수정 이상: 상품명 바뀌었는데 주문내역 여러 줄을 다 수정해야 함
- 삽입 이상: 상품 정보만 먼저 넣고 싶은데 주문이 없으면 넣기 애매
- 삭제 이상: 마지막 주문을 지우면 상품 정보/고객등급 정보까지 같이 사라질 수 있음
정규화는 이걸 막습니다.
5) BCNF / 4NF / 5NF는 뭐냐? (아주 쉽게)
이미지의 마지막은 “1~3NF로 대부분 끝나지만, 더 복잡하면 확장 정규형이 있다”는 소개입니다.
- BCNF: 3NF보다 더 엄격한 버전
- “결정자(왼쪽)가 항상 후보키여야 한다”
- 예: (교수ID, 과목) 같은 조합에서 “교수ID가 과목을 결정”하는데 교수ID가 후보키가 아니면 문제 → BCNF로 해결
- 4NF: “다치 종속” 제거
- 한 사람이 취미도 여러 개, 사용언어도 여러 개면
취미×언어 조합으로 데이터가 폭발적으로 중복됨 → 분리
- 한 사람이 취미도 여러 개, 사용언어도 여러 개면
- 5NF: “조인 종속” 문제 해결
- 여러 테이블로 쪼갰다가 다시 조인할 때 중복/손실 없이 복원되는지까지 고려하는 고급 단계
초간단 요약
- 1NF: 한 칸에 값 1개(리스트 금지)
- 2NF: 복합키에서 “부분 종속” 제거(상품명은 상품 테이블로)
- 3NF: “이행 종속” 제거(고객등급명은 등급 테이블로)
- 대부분 실무는 1~3NF가 기본이고, 더 복잡하면 BCNF/4NF/5NF를 고려
반응형