정규화 단계 (1NF~BCNF) — 각 단계 조건과 이상 현상
🔥 매회 출제 (priority 3)
🌱 왜 배우나
학생 이름, 전화번호, 수강 과목, 성적을 한 장의 표에 몽땅 적었다고 상상해 보자. 학생 이름이 바뀌면 그 학생이 들은 모든 과목 줄을 일일이 고쳐야 한다. 아직 아무도 수강하지 않은 새 과목을 넣으려면 가짜 학생을 끼워 넣어야 하고, 마지막 수강생이 취소하면 과목 정보까지 같이 사라진다. 이런 오류를 막으려고 표를 주제별로 나누는 설계 원칙이 정규화다. 옷장을 정리할 때 상의·하의·속옷 서랍을 따로 두는 것과 같은 발상이다.
📖 핵심 개념
정규화(Normalization)는 관계형 데이터베이스(데이터를 표 형태로 저장하는 시스템)에서 하나의 큰 표를 여러 작은 표로 쪼개는 설계 과정이다. 목적은 데이터 중복을 줄이고 이상 현상(Anomaly)을 없애는 것이다. 핵심 원칙은 “표 하나에는 주제 하나만 담는다”이다.
이상 현상은 세 가지로 나뉜다. 삽입 이상은 넣기 싫은 데이터를 억지로 같이 넣어야 하는 문제, 삭제 이상은 한 줄을 지웠더니 남겨야 할 정보까지 사라지는 문제, 갱신 이상은 같은 값이 여러 곳에 흩어져 있어 일부만 고치면 데이터가 서로 안 맞는 문제다.
각 단계는 함수 종속(Functional Dependency, FD)을 기준으로 표를 쪼갠다. 함수 종속이란 “학번을 알면 이름이 자동으로 결정된다”처럼 한 값이 다른 값을 결정짓는 관계다. 단계는 1NF → 2NF → 3NF → BCNF(Boyce-Codd Normal Form) → 4NF → 5NF 순으로 진행한다. 실무에서는 보통 3NF나 BCNF까지만 적용한다.
🔍 시각화
[비정규] ──▶ [1NF] ──▶ [2NF] ──▶ [3NF] ──▶ [BCNF]
│ │ │ │
▼ ▼ ▼ ▼
반복값 제거 부분종속 이행종속 모든 결정자
(원자값만) 제거 제거 = 후보키
예시 흐름:
┌──────────────────────────────────────┐
│ 학번 │ 이름 │ 과목 │ 성적 │ 교수 │ ← 비정규 (한 표에 다 섞임)
└──────────────────────────────────────┘
▼ 2NF 분해
┌───────────────┐ ┌──────────────────┐
│ 학번 │ 이름 │ │ 학번 │ 과목 │ 성적│ ← 학생 표 / 수강 표
└───────────────┘ └──────────────────┘
↔️ 이웃 개념 구분
- 정규화 vs 반정규화: 정규화는 중복을 없애려고 표를 쪼갠다. 반정규화(Denormalization)는 속도를 위해 일부러 다시 합친다. 방향이 정반대다.
- 함수 종속 vs 다치 종속: 함수 종속은 “A → B”로 값이 하나로 결정된다. 다치 종속(Multi-Valued Dependency, MVD)은 A 하나에 B가 여러 개 대응된다(4NF에서 제거).
🔑 핵심 용어
- 제1정규형(1NF): 한 칸에 값이 하나만 들어가야 한다(원자값). “수학, 영어”처럼 한 칸에 여러 값을 넣으면 위반.
- 제2정규형(2NF): 1NF를 만족하면서, 기본키의 일부에만 매달린 속성을 따로 뺀다(부분 함수 종속 제거).
- 제3정규형(3NF): 2NF를 만족하면서, A→B→C처럼 중간을 거쳐 결정되는 관계를 떼어낸다(이행 함수 종속 제거).
- BCNF: 3NF를 만족하면서, 다른 속성을 결정하는 모든 속성이 후보키여야 한다. 후보키가 아닌 속성이 결정자 역할을 하면 위반.
- 제4정규형(4NF): BCNF를 만족하면서 다치 종속을 제거.
- 제5정규형(5NF): 4NF를 만족하면서 조인 종속(Join Dependency, 쪼갠 표를 다시 합쳤을 때 원본과 같아야 한다는 제약)을 제거.
- 이상 현상: 삽입·삭제·갱신 이상 세 가지. 표 설계가 나쁠 때 생기는 데이터 오류.
✅ 스스로 가르쳐보기
이 내용을 처음 듣는 친구에게 3분 안에 설명한다면 어떻게 시작하시겠어요? “왜 표를 쪼개야 하는가”를 본인만의 일상 비유 하나로 먼저 풀어 보고, 그다음에 1NF부터 BCNF까지 단계별로 “무엇을 제거하는지”를 순서대로 말해 보자.
체크포인트:
- 이상 현상 세 가지(삽입·삭제·갱신)를 각각 한 줄로 설명할 수 있는가
- 각 단계에서 제거하는 종속 유형(원자값·부분·이행·결정자≠후보키)을 순서대로 말할 수 있는가
- 함수 종속을 비유 없이 한 문장으로 정의할 수 있는가
- 3NF와 BCNF의 차이를 한 문장으로 말할 수 있는가
🎯 기출 포인트
정규화 단계 순서와 각 단계에서 제거하는 종속 유형을 정확히 구분하라. 암기법: “도부이결다조”(도메인 원자값 → 부분 함수 종속 → 이행 함수 종속 → 결정자 → 다치 종속 → 조인 종속). 시험에서는 “부분 함수 종속 제거 = 2NF”, “이행 함수 종속 제거 = 3NF”를 묻는 문제가 가장 자주 나온다.
🔗 연결 개념
db-modeling-002- DDL 명령어 (CREATE, ALTER, DROP, TRUNCATE)