정규화

정규화 (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모든 속성이 원자 값
2NF1NF + 부분 함수 종속 제거
3NF2NF + 이행적 함수 종속 제거
BCNF모든 결정자가 후보키

함수 종속 유형

유형설명
완전 함수 종속결정자 전체에 종속
부분 함수 종속결정자 일부에도 종속
이행적 함수 종속X→Y, Y→Z ⇒ X→Z