정규화·반정규화 완벽 정리
1NF·2NF·3NF·BCNF 단계별 핵심과 반정규화까지 한눈에 정리
1. 정규화의 목적
정규화란?
릴레이션(테이블)을 분해하여 데이터 중복을 제거하고 이상현상을 방지하는 과정. 함수적 종속성을 기반으로 테이블을 더 작은 단위로 분리하여 데이터 무결성을 확보한다.
정규화의 핵심 목적
- • 데이터 중복 최소화 — 동일 데이터가 여러 곳에 저장되는 것을 방지
- • 이상현상(Anomaly) 방지 — 삽입·갱신·삭제 시 발생하는 문제 제거
- • 데이터 무결성 보장 — 일관성 있는 데이터 유지
2. 이상현상 (Anomaly)
이상현상의 3가지 유형
| 유형 | 설명 | 예시 |
|---|---|---|
| 삽입 이상 | 불필요한 데이터를 함께 삽입해야 함 | 학과 정보만 넣고 싶은데 학생 정보도 필요 |
| 갱신 이상 | 일부만 수정되어 데이터 불일치 발생 | 학과명 변경 시 일부 행만 수정되면 불일치 |
| 삭제 이상 | 필요한 데이터도 함께 삭제됨 | 학생 삭제 시 학과 정보까지 사라짐 |
이상현상 예시 테이블
아래처럼 정규화되지 않은 테이블에서 이상현상이 발생한다.
| 학번 | 이름 | 학과코드 | 학과명 |
|---|---|---|---|
| 101 | 김철수 | D01 | 컴퓨터공학 |
| 102 | 이영희 | D01 | 컴퓨터공학 |
| 103 | 박민수 | D02 | 경영학 |
"학과명"이 중복 저장되어 갱신 이상 발생 가능. D01 학과 학생을 모두 삭제하면 학과 정보도 사라짐(삭제 이상).
3. 함수적 종속성 (Functional Dependency)
함수적 종속성이란?
X 값이 Y 값을 유일하게 결정하면 Y는 X에 함수적으로 종속된다고 하며 X → Y로 표기한다. X를 결정자, Y를 종속자라 한다.
함수적 종속성의 종류
| 종류 | 설명 | 예시 |
|---|---|---|
| 완전 함수 종속 | 기본키 전체에 종속 | (학번, 과목) → 성적 |
| 부분 함수 종속 | 기본키 일부에만 종속 | (학번, 과목) → 이름 (학번만으로 결정) |
| 이행 함수 종속 | A→B, B→C이면 A→C | 학번→학과코드→학과명 |
4. 정규화 단계
제1정규형 (1NF)
모든 속성이 원자값(Atomic Value)을 가져야 한다. 반복 그룹이나 다중값 속성을 제거한다.
Before (1NF 위반)
| 학번 | 이름 | 수강과목 |
|---|---|---|
| 101 | 김철수 | DB, 알고리즘, OS |
| 102 | 이영희 | DB, 네트워크 |
After (1NF 적용)
| 학번 | 이름 | 수강과목 |
|---|---|---|
| 101 | 김철수 | DB |
| 101 | 김철수 | 알고리즘 |
| 101 | 김철수 | OS |
| 102 | 이영희 | DB |
| 102 | 이영희 | 네트워크 |
제2정규형 (2NF)
1NF를 만족하고 부분 함수 종속을 제거한 상태. 기본키가 복합키일 때만 의미가 있다.
복합키 (학번, 과목) 중 "학번"만으로 결정되는 "이름" 속성은 부분 함수 종속이므로 별도 테이블로 분리한다.
분리 전:
수강(학번, 과목, 이름, 성적) → 학번→이름 (부분종속)
분리 후:
학생(학번, 이름)
수강(학번, 과목, 성적)
제3정규형 (3NF)
2NF를 만족하고 이행 함수 종속을 제거한 상태. A→B→C에서 A→C 종속을 제거한다.
분리 전:
학생(학번, 이름, 학과코드, 학과명) → 학번→학과코드→학과명 (이행종속)
분리 후:
학생(학번, 이름, 학과코드)
학과(학과코드, 학과명)
보이스-코드 정규형 (BCNF)
3NF를 만족하고 모든 결정자가 후보키인 상태. 후보키가 아닌 속성이 결정자가 되는 경우를 제거한다.
예시:
수강(학번, 과목, 교수) — 교수→과목 (교수가 결정자이지만 후보키가 아님)
분리 후:
수강(학번, 교수)
담당(교수, 과목)
5. 정규화 단계별 핵심 비교
단계별 비교 테이블
| 단계 | 제거 대상 | 조건 | 핵심 키워드 |
|---|---|---|---|
| 1NF | 다중값, 반복 그룹 | 모든 속성이 원자값 | 원자값 |
| 2NF | 부분 함수 종속 | 1NF + 완전 함수 종속 | 복합키, 부분종속 |
| 3NF | 이행 함수 종속 | 2NF + 이행종속 없음 | A→B→C |
| BCNF | 비후보키 결정자 | 3NF + 모든 결정자가 후보키 | 결정자 = 후보키 |
정규화 순서 암기
"원부이결" — 원자값(1NF) → 부분종속 제거(2NF) → 이행종속 제거(3NF) → 결정자가 후보키(BCNF)
6. 반정규화 (Denormalization)
반정규화란?
정규화된 테이블을 조회 성능 향상을 위해 의도적으로 중복·통합·분리하는 기법. 조인 횟수를 줄여 조회 속도를 높이지만 데이터 무결성이 저하될 수 있다.
반정규화 절차
반드시 정규화를 먼저 수행한 후, 성능 저하가 발생할 때 필요한 부분에만 반정규화를 적용한다.
- 1. 정규화를 정확히 수행
- 2. 성능 문제 발생 여부 확인
- 3. 반정규화 대상 선정
- 4. 반정규화 적용 후 무결성 보완 방안 마련
반정규화 유형
| 대상 | 기법 | 설명 |
|---|---|---|
| 테이블 | 테이블 병합 | 1:1 또는 1:N 관계를 하나로 통합 |
| 테이블 분할 | 수직 분할(컬럼 기준) 또는 수평 분할(행 기준) | |
| 테이블 추가 | 통계, 이력, 부분 테이블 추가 | |
| 컬럼 | 중복 컬럼 추가 | 조인 줄이기 위해 다른 테이블 컬럼 복사 |
| 파생 컬럼 추가 | 계산 결과를 미리 저장 (합계, 평균 등) | |
| 관계 | 중복 관계 추가 | 빠른 경로로 직접 참조 관계 추가 |
수직 분할 vs 수평 분할
| 구분 | 수직 분할 | 수평 분할 |
|---|---|---|
| 기준 | 컬럼 기준으로 분할 | 행 기준으로 분할 |
| 사용 시점 | 자주 사용하는 컬럼과 아닌 컬럼 분리 | 특정 범위 데이터만 자주 조회할 때 |
| 예시 | BLOB/TEXT 컬럼 분리 | 연도별, 지역별 분할 |
7. 시험 빈출 포인트
자주 출제되는 유형
- • 정규화 단계 순서 — 1NF → 2NF → 3NF → BCNF 순서와 각 단계에서 제거하는 종속성
- • 2NF는 복합키일 때만 의미 — 단일키 테이블은 이미 2NF
- • 이상현상 유형 구분 — 삽입/갱신/삭제 이상 각각의 정의와 예시
- • 반정규화 목적 — 조회 성능 향상 (데이터 무결성 향상이 아님!)
- • 반정규화는 정규화 이후 — 정규화를 먼저 수행하고, 필요 시 반정규화
- • BCNF와 3NF 차이 — 3NF는 후보키가 아닌 속성 간 이행종속 제거, BCNF는 모든 결정자가 후보키
개념을 확인했다면 문제로 실력을 검증해보세요