제1정규형 ~ 제3정규형
정규화는 단계별로 진행됩니다. 각 단계에서 어떤 문제를 해결하는지, 실제 테이블이 어떻게 분해되는지를 예제로 확인합니다. 정규화의 각 단계는 반복 그룹, 부분 함수 종속, 이행 함수 종속처럼 이상 현상을 만드는 구조를 제거합니다.
함수 종속(Functional Dependency) 복습
정규화를 이해하려면 먼저 함수 종속 개념이 명확해야 합니다.
제1정규형 (1NF)
1NF의 조건: 모든 속성의 값이 원자값(Atomic Value)이어야 합니다. 하나의 셀에 여러 값이 들어가면 안 됩니다. 또한 반복 그룹(Repeating Group)이 없어야 합니다. 원자값인지 아닌지는 물리적인 문자열 길이보다 그 값을 더 쪼개서 검색·조인·집계·제약 대상으로 다룰 필요가 있는가로 판단합니다.
1NF를 적용하면 행이 늘어나지만, 각 셀에 하나의 값만 존재합니다. 이것이 관계형 모델의 가장 기본적인 제약입니다.
1NF와 실무
실무에서 1NF 위반은 의외로 흔합니다. JSON 컬럼이나 콤마 구분 문자열을 하나의 값처럼 저장하는 경우가 대표적입니다. 단, JSON을 완전히 불투명한 값으로 저장하는 설계와 JSON 내부 값을 조건 검색·조인·집계 대상으로 쓰는 설계는 구분해야 합니다. 내부 값을 관계형 데이터처럼 다룬다면 별도 테이블 분리를 우선 검토합니다.
제2정규형 (2NF)
2NF의 조건: 1NF를 만족하면서, 부분 함수 종속이 없어야 합니다.
부분 함수 종속이란 후보키가 복합 속성일 때, 비주요 속성이 후보키 전체가 아니라 후보키의 진부분집합에만 종속되는 것입니다. 이때 기본키로 선택한 키 하나만 보는 것이 아니라 모든 후보키를 기준으로 검사합니다. 모든 후보키가 단일 컬럼이면 부분 함수 종속이 발생할 수 없으므로 2NF 판단은 사실상 통과합니다.
삽입 이상 (Insert Anomaly)
* 아직 수강 과목이 없는 신입생 '박민수'를 등록할 수 없음
* 후보키의 일부인 '과목코드'가 NULL이면 PK 위반
갱신 이상 (Update Anomaly)
* 김철수의 학과를 '소프트웨어'로 변경하려면
* 1001/DB 행과 1001/알고리즘 행 두 곳을 모두 수정
* 하나만 수정하면 데이터 불일치!
삭제 이상 (Delete Anomaly)
* 이영희가 DB를 수강 취소하면 해당 행 삭제
* 이영희의 이름, 학과 정보도 함께 소실!부분 함수 종속인 학번 → 이름, 학과를 학번만으로 구성된 별도 테이블로 분리했습니다. 이제 김철수의 학과를 변경해도 한 곳만 수정하면 됩니다. 수강 테이블에는 {학번, 과목코드}처럼 수강 사실을 식별하는 키와 성적처럼 그 조합에서 생기는 속성만 남깁니다.
2NF 분해 판단 방법
제3정규형 (3NF)
3NF의 조건: 2NF를 만족하면서, 이행 함수 종속이 없어야 합니다.
이행 함수 종속이란 A → B, B → C일 때 A → C가 되는 것입니다. 3NF 위반 맥락에서는 후보키가 아닌 중간 속성이 다른 비주요 속성을 결정하는 관계를 특히 주의합니다. 엄밀히는 모든 비자명 함수 종속 X → A에 대해 X가 슈퍼키이거나 A가 주요 속성이어야 3NF를 만족합니다. 따라서 "비주요 → 비주요"는 빠른 판별 요령이고, 후보키가 여러 개 있는 스키마에서는 주요 속성 예외까지 함께 확인해야 합니다.
컴공의 학과장이 바뀌면 1001, 1003 두 행을 모두 수정해야 합니다 — 갱신 이상입니다.
갱신 이상
* 컴공의 학과장이 '정교수' → '최교수'로 변경
* 학생 1001과 1003 두 곳 수정 필요
* 하나만 수정하면 학과장 정보 불일치!
삽입 이상
* '기계공학과 - 박교수' 정보를 넣으려면
* 해당 학과 학생이 없으면 저장할 방법 없음
삭제 이상
* 학번 1002 이영희 삭제 시
* '전자 - 한교수' 정보도 함께 소실이행 함수 종속의 중간 속성(학과)을 키로 하는 새 테이블을 만들어 분리합니다. 학생 테이블은 학과만 참조하고, 학과장이 바뀌면 학과 테이블 한 행만 수정합니다.
3NF 분해 판단 방법
실무 적용 사례: 주문 시스템
실제 주문 시스템을 1NF → 2NF → 3NF 순서로 정규화하는 과정을 봅니다.
무손실 분해와 종속성 보존
정규화로 테이블을 분해할 때 두 가지 조건을 만족해야 합니다. 무손실 조인은 정보가 사라지거나 가짜 행이 생기지 않게 하는 필수 조건이고, 종속성 보존은 중요한 제약을 분해된 테이블만으로 검사할 수 있게 하는 바람직한 조건입니다. 3NF 분해는 보통 둘을 함께 만족하도록 만들 수 있지만, BCNF에서는 무손실 조인을 우선하면서 종속성 보존을 일부 포기하는 경우가 있습니다.
정규화 단계 정리
비정규형
│
│ ① 원자값 보장, 반복 그룹 제거
▼
1NF ── 모든 셀에 원자값만 존재
│
│ ② 부분 함수 종속 제거
▼
2NF ── 복합키 일부에만 종속되는 속성 분리
│
│ ③ 이행 함수 종속 제거
▼
3NF ── A→B→C 형태의 종속 분리
│
│ ④ 모든 비자명 FD의 결정자가 슈퍼키
▼
BCNF ── 슈퍼키가 아닌 결정자 분리
│
│ ⑤ 다치 종속 제거
▼
4NF
│
│ ⑥ 조인 종속 제거
▼
5NF| 정규형 | 제거 대상 | 핵심 질문 |
|---|---|---|
| 1NF | 다중 값, 반복 그룹 | 한 셀에 값이 하나인가? |
| 2NF | 부분 함수 종속 | 복합 후보키 일부에만 종속되는 비주요 속성이 있는가? |
| 3NF | 이행 함수 종속 | 비주요 속성이 다른 비주요 속성을 결정하는가? |
정규형 판별 연습
주어진 테이블이 몇 정규형을 만족하는지 판별하는 연습입니다.
Step 1: 후보키 확인
* 모든 후보키가 단일 속성? → 2NF 자동 만족 → 3NF만 확인
Step 2: 복합키이면
* 후보키의 일부 → 비주요 속성? → 2NF 위반
Step 3: 비키 → 비키 종속 확인
* 비주요 속성이 다른 비주요 속성 결정? → 3NF 위반
* 후보키가 여러 개라면 오른쪽 속성이 주요 속성인지도 확인정규화와 실무 적용
다음 절에서는 3NF를 넘어 BCNF와 그 이상의 정규형을 살펴봅니다.