정규화 1NF~BCNF와 반정규화
쉽게 말하면
정규화는 한 표에 섞인 사실들을 알맞게 나눠 중복을 없애는 정리 작업이에요. 한 칸에 값 하나씩(1NF), 키 일부에만 딸린 칸은 떼어 내고(2NF), 다른 칸을 거쳐 정해지는 칸도 떼어 내요(3NF). 너무 잘게 나눠 조회가 느려지면 일부러 다시 합치기도 하는데, 이걸 반정규화라고 해요.
시험용 정의
정규화(Normalization)는 함수 종속을 기준으로 테이블을 쪼개서 중복과 이상 현상을 없애는 과정이다. 단계마다 제1정규형(1NF): 원자값, 제2정규형(2NF): 부분 함수 종속 제거, 제3정규형(3NF): 이행 함수 종속 제거, BCNF: 모든 결정자가 후보키, 순으로 조건이 강해진다. 논리적 데이터 모델링 단계에서 한다.
비유로 이해하기
엉킨 서랍 정리와 같다. 한 칸에 하나씩(1NF), 서랍 이름표에 딱 맞는 물건만(2NF), 다른 물건을 거쳐야 찾을 수 있는 물건은 따로 서랍으로(3NF) 나눈다.
자세히
그림으로 보기: 정규화 단계
- 1NF모든 속성 값이 더 나눌 수 없는 원자값
- 2NF부분 함수 종속 제거(기본키 전체에 종속)
- 3NF이행 함수 종속 제거(A → B → C 끊기)
- BCNF결정자가 모두 후보키
- 4NF다치 종속 제거
- 5NF조인 종속 제거
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 원자값 | 더 쪼갤 필요가 없는 값 하나. 한 칸에 값 하나 |
| 부분 함수 종속 | 복합키의 일부에만 종속되는 관계 (학번 → 학생이름, 키는 학번+과목) |
| 이행 함수 종속 | A → B, B → C 로 A → C가 건너서 생기는 관계 |
| 후보키 | 행을 유일하게 구별할 수 있는 최소 속성 조합. 기본키 후보 |
| 조인 | 쪼갠 테이블을 공통 열로 다시 이어 붙이는 SQL 연산 |
정규형 단계
| 정규형 | 조건 | 하는 일 | 예 |
|---|---|---|---|
| 1NF | 모든 속성이 원자값 | 반복 그룹·다중값 속성을 별도 테이블로 | 전화번호 여러 개 → 회원전화 테이블 |
| 2NF | 1NF + 부분 함수 종속 없음 | 복합키 일부에만 종속된 속성을 떼어 낸다 | 수강(학번,과목,학생이름) → 학생(학번,학생이름) 분리 |
| 3NF | 2NF + 이행 함수 종속 없음 | 키가 아닌 속성에 종속된 속성을 떼어 낸다 | 사원(사번,부서번호,부서명) → 부서(부서번호,부서명) 분리 |
| BCNF | 3NF + 모든 결정자가 후보키 | 후보키가 아닌 결정자를 분리한다 | (학생,과목) → 교수, 교수 → 과목 일 때 교수를 분리 |
정규화와 성능
- 정규화하면 중복이 줄어 입력·수정·삭제 성능이 좋아지고 이상 현상이 없어진다
- 테이블이 쪼개져 조회할 때 조인이 늘어나 조회가 느려질 수 있다. 하지만 항상 느려지는 것은 아니다. 작은 테이블을 읽게 되어 오히려 빨라지기도 한다
- 반정규화(Denormalization)는 조회 성능을 위해 일부러 중복을 허용하는 것(테이블 합치기, 계산 결과 컬럼 추가 등)이다. 데이터 무결성이 깨질 위험이 있어 정규화를 먼저 하고, 꼭 필요할 때 마지막에 한다
시험에 이렇게 나와요
- 표를 보고 몇 정규형인지, 어떤 정규형을 위반했는지 고르기
- 1NF 원자값, 2NF 부분 함수 종속 제거, 3NF 이행 함수 종속 제거, BCNF 결정자가 모두 후보키
- 정규화의 효과: 이상 현상 제거, 입력·수정 성능 향상, 조회는 조인 증가로 느려질 수도
- 반정규화는 정규화 뒤 성능을 위해 중복을 허용하는 것
출제 범위·공식 안내 기반
확인 문제
Q1. 회원 테이블의 '전화번호' 칸에 "010-1111-2222, 02-333-4444"처럼 번호 두 개를 넣었다. 어떤 정규형을 어겼을까요?
- 제2정규형
- 제3정규형
- BCNF
- 제1정규형
정답 보기
4번 제1정규형
한 칸에는 원자값 하나만 들어가야 한다는 제1정규형을 어겼다. 전화번호를 별도 테이블(회원번호, 전화번호)로 분리한다.
Q2. 기본키가 (주문번호, 상품번호)인 주문상세 테이블에 '상품명'이 있다. 상품명은 상품번호에만 종속된다. 이 테이블은 어떤 정규형을 위반했나?
- BCNF
- 3NF
- 2NF
- 1NF
정답 보기
3번 2NF
복합키의 일부(상품번호)에만 종속된 부분 함수 종속이므로 2NF 위반. 상품 테이블로 분리한다.
Q3. 사원(사번, 이름, 부서번호, 부서위치)에서 부서위치는 부서번호에 종속된다. 어떻게 정규화하나?
- 이름을 분리한다
- 부서(부서번호, 부서위치)로 분리해 이행 종속을 없앤다
- 사원 테이블에 부서위치를 그대로 둔다
- 사번을 복합키로 바꾼다
정답 보기
2번 부서(부서번호, 부서위치)로 분리해 이행 종속을 없앤다
사번 → 부서번호 → 부서위치 이행 종속. 3NF로 부서 테이블을 분리한다.
Q4. 정규화에 대한 설명으로 틀린 것은?
- 정규화하면 조회 성능이 반드시 좋아진다
- 반정규화는 성능을 위해 중복을 허용하는 것이다
- 논리적 모델링 단계에서 수행한다
- 중복을 줄여 이상 현상을 없앤다
정답 보기
1번 정규화하면 조회 성능이 반드시 좋아진다
조인이 늘어나 조회가 느려질 수도 있고 빨라질 수도 있다. '반드시'는 틀렸다.
Q5. BCNF의 조건으로 알맞은 것은?
- 부분 함수 종속이 없음
- 모든 속성이 원자값
- 다치 종속이 없음
- 모든 결정자가 후보키
정답 보기
4번 모든 결정자가 후보키
BCNF는 결정자이면서 후보키가 아닌 속성이 없어야 한다.
헷갈리기 쉬운 O·X
제2정규형은 이행 함수 종속을 제거한 상태다.
정답 보기
X 2NF는 부분 함수 종속 제거, 이행 함수 종속 제거는 3NF다.
기본키가 속성 하나뿐인 테이블은 1NF를 만족하면 부분 함수 종속이 생길 수 없다.
정답 보기
O 부분 함수 종속은 복합키의 '일부'에 종속되는 것이라 단일 키에는 생기지 않는다.
반정규화는 정규화보다 먼저 하는 것이 원칙이다.
정답 보기
X 정규화를 먼저 하고, 성능 문제가 확인될 때 반정규화를 검토한다.