정규화
정규화 (Normalization)
정규화는 이상 현상을 제거하면서 데이터베이스를 올바르게 설계해 나가는 과정이다. 릴레이션을 관련 있는 속성들로만 구성하도록 분해(decomposition)한다.
1. 이상 현상 (Anomaly)
데이터베이스를 잘못 설계하면 불필요한 데이터 중복이 발생하여 삽입/수정/삭제 시 부작용이 발생한다.
예제: 이상 현상이 발생하는 릴레이션
수강 릴레이션 (잘못된 설계)
┌────────┬────────┬────────┬──────────┬────────┐
│ 학번 │ 이름 │ 과목코드 │ 과목명 │ 성적 │
├────────┼────────┼────────┼──────────┼────────┤
│ 001 │ 홍길동 │ DB01 │ 데이터베이스│ A │
│ 001 │ 홍길동 │ OS01 │ 운영체제 │ B │
│ 002 │ 김영희 │ DB01 │ 데이터베이스│ A │
│ 003 │ 이철수 │ NET01 │ 네트워크 │ C │
└────────┴────────┴────────┴──────────┴────────┘
문제점:
- 학생 정보(학번, 이름) 중복 저장
- 과목 정보(과목코드, 과목명) 중복 저장1.1 삽입 이상 (Insertion Anomaly)
새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제
"새 과목 'AI01 - 인공지능'을 추가하고 싶다"
→ 아직 수강생이 없으면 학번, 이름, 성적에 NULL을 넣어야 함
→ 기본키(학번, 과목코드)에 NULL이 들어갈 수 없어 삽입 불가!
┌────────┬────────┬────────┬──────────┬────────┐
│ NULL │ NULL │ AI01 │ 인공지능 │ NULL │ ← 삽입 불가
└────────┴────────┴────────┴──────────┴────────┘1.2 갱신 이상 (Update Anomaly)
중복 투플 중 일부만 수정하여 데이터가 불일치하게 되는 문제
"과목명 '데이터베이스'를 'DB시스템'으로 변경하고 싶다"
→ 일부 투플만 수정하면 데이터 불일치 발생!
┌────────┬────────┬────────┬──────────┬────────┐
│ 001 │ 홍길동 │ DB01 │ DB시스템 │ A │ ← 수정됨
│ 002 │ 김영희 │ DB01 │ 데이터베이스│ A │ ← 수정 안됨 (불일치!)
└────────┴────────┴────────┴──────────┴────────┘1.3 삭제 이상 (Deletion Anomaly)
투플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 문제
"이철수 학생의 수강 기록을 삭제하고 싶다"
→ 'NET01 - 네트워크' 과목 정보까지 함께 삭제됨!
삭제 전:
│ 003 │ 이철수 │ NET01 │ 네트워크 │ C │
삭제 후:
→ NET01 과목이 존재했다는 정보 자체가 사라짐 (데이터 손실)2. 함수 종속 (Functional Dependency)
2.1 함수 종속의 개념
속성 집합 X의 값이 속성 집합 Y의 값을 유일하게 결정하면:
- “X가 Y를 함수적으로 결정한다”
- “Y가 X에 함수적으로 종속되어 있다”
표기: X → Y
X: 결정자 (Determinant)
Y: 종속자 (Dependent)예제
학생 릴레이션
┌────────┬────────┬────────┬────────┐
│ 학번 │ 이름 │ 학과코드 │ 학과명 │
├────────┼────────┼────────┼────────┤
│ 001 │ 홍길동 │ CS │ 컴퓨터 │
│ 002 │ 김영희 │ BA │ 경영학 │
│ 003 │ 이철수 │ CS │ 컴퓨터 │
└────────┴────────┴────────┴────────┘
함수 종속 관계:
- 학번 → 이름 (학번이 이름을 결정)
- 학번 → 학과코드 (학번이 학과코드를 결정)
- 학과코드 → 학과명 (학과코드가 학과명을 결정)
- 학번 → 학과명 (이행적 함수 종속)2.2 함수 종속 다이어그램
┌─────────────────────────────────────────────┐
│ 함수 종속 다이어그램 │
├─────────────────────────────────────────────┤
│ │
│ ┌──────┐ │
│ │ 학번 │ │
│ └──┬───┘ │
│ │ │
│ ┌──────┼──────┐ │
│ ↓ ↓ ↓ │
│ ┌─────┐ ┌─────┐ ┌──────┐ │
│ │ 이름 │ │학과코드│ │ 성적 │ │
│ └─────┘ └──┬──┘ └──────┘ │
│ │ │
│ ↓ │
│ ┌─────┐ │
│ │학과명 │ │
│ └─────┘ │
│ │
│ 학번 → {이름, 학과코드, 성적} │
│ 학과코드 → 학과명 │
│ │
└─────────────────────────────────────────────┘2.3 완전 함수 종속 vs 부분 함수 종속
| 구분 | 완전 함수 종속 (FFD) | 부분 함수 종속 (PFD) |
|---|---|---|
| 정의 | X 전체에 종속 | X의 일부에도 종속 |
| 조건 | 결정자의 부분집합으로 결정 불가 | 결정자의 부분집합으로도 결정 가능 |
수강 릴레이션
기본키: (학번, 과목코드)
┌────────────────────┬────────┬────────┬──────────┐
│ (학번, 과목코드) │ 이름 │ 성적 │ 과목명 │
├────────────────────┼────────┼────────┼──────────┤
│ (001, DB01) │ 홍길동 │ A │ 데이터베이스│
└────────────────────┴────────┴────────┴──────────┘
완전 함수 종속:
(학번, 과목코드) → 성적 ← 둘 다 있어야 성적 결정 가능
부분 함수 종속:
(학번, 과목코드) → 이름 ← 학번만으로도 이름 결정 가능!
(학번, 과목코드) → 과목명 ← 과목코드만으로도 과목명 결정 가능!2.4 이행적 함수 종속 (Transitive FD)
X → Y 이고 Y → Z 이면, 논리적으로 X → Z
예시:
학번 → 학과코드
학과코드 → 학과명
────────────────
∴ 학번 → 학과명 (이행적 함수 종속)3. 정규형 (Normal Form)
정규형은 릴레이션이 정규화된 정도를 나타내는 기준이다.
비정규형 → 1NF → 2NF → 3NF → BCNF → 4NF → 5NF
↑
실무에서 주로 목표정규화 과정 요약
| 정규형 | 제거 대상 | 조건 |
|---|---|---|
| 1NF | 다중 값 속성 | 모든 속성이 원자 값 |
| 2NF | 부분 함수 종속 | 1NF + 완전 함수 종속 |
| 3NF | 이행적 함수 종속 | 2NF + 이행적 종속 제거 |
| BCNF | 후보키 아닌 결정자 | 모든 결정자가 후보키 |
4. 제1정규형 (1NF)
릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성
1NF 위반 예제
비정규형 (1NF 위반)
┌────────┬────────┬─────────────────┐
│ 학번 │ 이름 │ 수강과목 │
├────────┼────────┼─────────────────┤
│ 001 │ 홍길동 │ DB, OS, NET │ ← 다중 값! (원자 값 아님)
│ 002 │ 김영희 │ DB │
└────────┴────────┴─────────────────┘1NF 변환
제1정규형 (1NF)
┌────────┬────────┬────────┐
│ 학번 │ 이름 │ 수강과목 │
├────────┼────────┼────────┤
│ 001 │ 홍길동 │ DB │
│ 001 │ 홍길동 │ OS │
│ 001 │ 홍길동 │ NET │
│ 002 │ 김영희 │ DB │
└────────┴────────┴────────┘
→ 각 속성이 원자 값만 가짐
→ 기본키: (학번, 수강과목)5. 제2정규형 (2NF)
1NF + 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속
2NF 위반 예제
1NF 릴레이션 (2NF 위반)
기본키: (학번, 과목코드)
┌────────┬────────┬────────┬──────────┬────────┐
│ 학번 │ 과목코드 │ 이름 │ 과목명 │ 성적 │
├────────┼────────┼────────┼──────────┼────────┤
│ 001 │ DB01 │ 홍길동 │ 데이터베이스│ A │
│ 001 │ OS01 │ 홍길동 │ 운영체제 │ B │
│ 002 │ DB01 │ 김영희 │ 데이터베이스│ A │
└────────┴────────┴────────┴──────────┴────────┘
부분 함수 종속 발생:
- 학번 → 이름 (부분 종속)
- 과목코드 → 과목명 (부분 종속)2NF 변환 (분해)
학생 릴레이션 과목 릴레이션
┌────────┬────────┐ ┌────────┬──────────┐
│ 학번 │ 이름 │ │ 과목코드 │ 과목명 │
├────────┼────────┤ ├────────┼──────────┤
│ 001 │ 홍길동 │ │ DB01 │ 데이터베이스│
│ 002 │ 김영희 │ │ OS01 │ 운영체제 │
└────────┴────────┘ └────────┴──────────┘
수강 릴레이션
┌────────┬────────┬────────┐
│ 학번 │ 과목코드 │ 성적 │
├────────┼────────┼────────┤
│ 001 │ DB01 │ A │
│ 001 │ OS01 │ B │
│ 002 │ DB01 │ A │
└────────┴────────┴────────┘
→ 부분 함수 종속 제거됨
→ 무손실 분해: 자연 조인으로 원래 릴레이션 복원 가능6. 제3정규형 (3NF)
2NF + 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않음
3NF 위반 예제
2NF 릴레이션 (3NF 위반)
┌────────┬────────┬────────┬────────┐
│ 학번 │ 이름 │ 학과코드 │ 학과명 │
├────────┼────────┼────────┼────────┤
│ 001 │ 홍길동 │ CS │ 컴퓨터 │
│ 002 │ 김영희 │ BA │ 경영학 │
│ 003 │ 이철수 │ CS │ 컴퓨터 │
└────────┴────────┴────────┴────────┘
이행적 함수 종속 발생:
- 학번 → 학과코드 → 학과명
- 따라서 학번 → 학과명 (이행적 종속)
문제: 학과명 중복 저장 → 갱신 이상 발생 가능3NF 변환 (분해)
학생 릴레이션 학과 릴레이션
┌────────┬────────┬────────┐ ┌────────┬────────┐
│ 학번 │ 이름 │ 학과코드 │ │ 학과코드 │ 학과명 │
├────────┼────────┼────────┤ ├────────┼────────┤
│ 001 │ 홍길동 │ CS │ │ CS │ 컴퓨터 │
│ 002 │ 김영희 │ BA │ │ BA │ 경영학 │
│ 003 │ 이철수 │ CS │ └────────┴────────┘
└────────┴────────┴────────┘
→ 이행적 함수 종속 제거됨
→ 학과명 중복 저장 없음7. 보이스/코드 정규형 (BCNF)
릴레이션의 함수 종속 관계에서 모든 결정자가 후보키
BCNF vs 3NF
- 3NF: 기본키가 아닌 속성이 기본키에 종속
- BCNF: 모든 결정자가 후보키 (더 엄격)
BCNF 위반 예제
수강 릴레이션 (3NF 만족, BCNF 위반)
기본키: (학번, 과목)
후보키: (학번, 과목), (학번, 교수)
┌────────┬────────┬────────┐
│ 학번 │ 과목 │ 교수 │
├────────┼────────┼────────┤
│ 001 │ DB │ 김교수 │
│ 001 │ OS │ 이교수 │
│ 002 │ DB │ 김교수 │
│ 003 │ DB │ 박교수 │
└────────┴────────┴────────┘
함수 종속:
- (학번, 과목) → 교수 ← 기본키가 결정자 (OK)
- 교수 → 과목 ← 교수가 결정자인데 후보키 아님! (BCNF 위반)
(한 교수는 한 과목만 담당한다고 가정)BCNF 변환 (분해)
수강 릴레이션 교수 릴레이션
┌────────┬────────┐ ┌────────┬────────┐
│ 학번 │ 교수 │ │ 교수 │ 과목 │
├────────┼────────┤ ├────────┼────────┤
│ 001 │ 김교수 │ │ 김교수 │ DB │
│ 001 │ 이교수 │ │ 이교수 │ OS │
│ 002 │ 김교수 │ │ 박교수 │ DB │
│ 003 │ 박교수 │ └────────┴────────┘
└────────┴────────┘
→ 모든 결정자가 후보키가 됨8. 정규화 과정 정리
┌─────────────────────────────────────────────────────────────┐
│ 정규화 과정 흐름도 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 비정규형 │
│ │ │
│ │ 다중 값 속성 제거 │
│ ↓ │
│ ┌─────┐ │
│ │ 1NF │ ← 모든 속성이 원자 값 │
│ └──┬──┘ │
│ │ │
│ │ 부분 함수 종속 제거 │
│ ↓ │
│ ┌─────┐ │
│ │ 2NF │ ← 완전 함수 종속 │
│ └──┬──┘ │
│ │ │
│ │ 이행적 함수 종속 제거 │
│ ↓ │
│ ┌─────┐ │
│ │ 3NF │ ← 이행적 종속 없음 │
│ └──┬──┘ │
│ │ │
│ │ 후보키 아닌 결정자 제거 │
│ ↓ │
│ ┌──────┐ │
│ │ BCNF │ ← 모든 결정자가 후보키 │
│ └──────┘ │
│ │
└─────────────────────────────────────────────────────────────┘9. 역정규화 (Denormalization)
정규화는 데이터 무결성을 보장하지만, 조인이 많아져 성능이 저하될 수 있다. 성능 향상을 위해 의도적으로 중복을 허용하는 것을 역정규화라 한다.
역정규화 기법
| 기법 | 설명 |
|---|---|
| 테이블 병합 | 자주 조인되는 테이블을 하나로 합침 |
| 파생 컬럼 추가 | 계산 결과를 미리 저장 (합계, 평균 등) |
| 중복 컬럼 추가 | 조인 없이 조회하도록 컬럼 복사 |
역정규화 시 고려사항
정규화 ←─────────────────────→ 역정규화
장점: 무결성 보장 장점: 조회 성능 향상
저장 공간 절약 조인 감소
갱신 이상 없음
단점: 조인 증가 단점: 무결성 관리 어려움
조회 성능 저하 저장 공간 증가
갱신 이상 가능10. 정리
이상 현상
| 종류 | 문제 |
|---|---|
| 삽입 이상 | 불필요한 데이터도 함께 삽입해야 함 |
| 갱신 이상 | 일부만 수정 시 데이터 불일치 |
| 삭제 이상 | 필요한 데이터까지 함께 삭제됨 |
정규형 조건
| 정규형 | 조건 |
|---|---|
| 1NF | 모든 속성이 원자 값 |
| 2NF | 1NF + 부분 함수 종속 제거 |
| 3NF | 2NF + 이행적 함수 종속 제거 |
| BCNF | 모든 결정자가 후보키 |
함수 종속 유형
| 유형 | 설명 |
|---|---|
| 완전 함수 종속 | 결정자 전체에 종속 |
| 부분 함수 종속 | 결정자 일부에도 종속 |
| 이행적 함수 종속 | X→Y, Y→Z ⇒ X→Z |