제3정규형 (3NF)

핵심 인사이트 (3줄 요약)

  1. 본질: 제3정규형 (Third Normal Form, 3NF)은 2NF를 만족하며, 모든 비키 속성이 기본 키에 이행적으로 종속되지 않는 상태다.
  2. 가치: 3NF는 이행적 종속성 (Transitive Dependency)을 제거하여 데이터 중복을 더욱 줄이고, 갱�신 이상의 추가 원인을 제거한다.
  3. 융합: 3NF는 실무에서 가장 일반적으로 적용되는 정규형으로, 대부분의 테이블 설계에서 이 수준까지 정규화하면 충분한 경우가 많다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

개념 정의

제3정규형 (3NF)은 2NF를 만족하고, 이행적 종속성이 없는 상태다. 이행적 종속성이란 "기본 키 → X → Y"처럼 기본 키가 아닌 속성을 통해 다른 비키 속성이 간접적으로 종속되는 것을 말한다.

이행적 종속성이란?

┌─────────────────────────────────────────────────────────────────────┐
│                    이행적 종속성 예시                                       │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   [이행적 종속성 있는 테이블: 고객]                                   │
│   ┌────────┬────────┬────────┬──────────┐                       │
│   │ 고객ID* │ 이름    │ 도시   │ 도시코드  │                       │
│   ├────────┼────────┼────────┼──────────┤                       │
│   │ C001   │ 김철수  │ 서울   │ 02      │                       │
│   │ C002   │ 이영희  │ 부산   │ 051     │                       │
│   │ C003   │ 박민수  │ 서울   │ 02      │                       │
│   └────────┴────────┴────────┴──────────┘                       │
│       * = 기본 키                                                   │
│                                                                     │
│   종속성:                                                          │
│   • 고객ID → 도시 (직접 종속)                                       │
│   • 고객ID → 도시코드 (직접 종속)                                    │
│   • 도시 → 도시코드 (도시가 결정되면 도시코드가 결정)               │
│                                                                     │
│   이행적 종속:                                                      │
│   • 고객ID → 도시 → 도시코드                                         │
│   • (고객ID가 도시를 거쳐 도시코드에 간접 종속)                        │
│                                                                     │
│   문제점:                                                           │
│   • 도시코드 변경 시 도시=서울인 모든 행 수정 필요                     │
│   • 새 도시 '제주'과 코드 '064'를 추가하려면 고객ID가 필요 (삽입 이상)  │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 이행적 종속은 기본 키가 아닌 속성 (도시)을 경유하여 또 다른 속성 (도시코드)에 종속되는 것이다. 이 경우 도시코드 변경 시 고객ID로能找到하는 모든 행을 수정해야 하고, 도시 정보만 추가하려면 기본 키인 고객ID가 필요하므로 삽입이 불가능하다. 이러한 문제를 해결하려면 이행적 종속을 제거해야 한다.

비유

이행적 종속성은 **"학번 → 반 → 담임 선생님"**의 관계와 같다. 학번이 반을 결정하고 (직접), 반이 담임 선생님을 결정한다 (이행). 이 경우 반이 같으면 담임 선생님이 동일하므로, 선생님을別の 반으로 옮기려면 해당 반의 모든 학생 행을 수정해야 한다.

  • 📢 섹션 요약 비유:"학번이 반을 결정하고, 반이 선생님을 결정하면" (이행적 종속), 선생님이 바뀌면 해당 반의 모든 학생 정보를 수정해야 하는 번거로움이 있어요.

Ⅱ. 3NF 분해 과정

분해 전 (2NF, but not 3NF)

┌─────────────────────────────────────────────────────────────────────┐
│                    3NF 분해 전 (이행적 종속성 존재)                          │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   고객 (2NF, 이행적 종속 존재):                                      │
│   ┌────────┬────────┬────────┬──────────┐                       │
│   │ 고객ID* │ 이름    │ 도시   │ 도시코드  │                       │
│   ├────────┼────────┼────────┼──────────┤                       │
│   │ C001   │ 김철수  │ 서울   │ 02      │                       │
│   │ C002   │ 이영희  │ 부산   │ 051     │                       │
│   │ C003   │ 박민수  │ 서울   │ 02      │                       │
│   └────────┴────────┴────────┴──────────┘                       │
│       * = 기본 키                                                   │
│                                                                     │
│   종속성:                                                          │
│   • 고객ID → (이름, 도시, 도시코드)                                  │
│   • 도시 → 도시코드 (비키 → 비키, 이행적 종속)                        │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

분해 후 (3NF 충족)

┌─────────────────────────────────────────────────────────────────────┐
│                    3NF 분해 후 (3NF 충족)                                 │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   [고객] (기본 키: 고객ID)                                           │
│   ┌────────┬────────┬────────┐                                    │
│   │ 고객ID* │ 이름    │ 도시   │                                    │
│   ├────────┼────────┼────────┤                                    │
│   │ C001   │ 김철수  │ 서울   │                                    │
│   │ C002   │ 이영희  │ 부산   │                                    │
│   │ C003   │ 박민수  │ 서울   │                                    │
│   └────────┴────────┴────────┘                                    │
│                                                                     │
│   [도시] (기본 키: 도시)                                            │
│   ┌────────┬──────────────┐                                        │
│   │ 도시*   │ 도시코드     │                                        │
│   ├────────┼──────────────┤                                        │
│   │ 서울   │ 02          │                                        │
│   │ 부산   │ 051         │                                        │
│   └────────┴──────────────┘                                        │
│                                                                     │
│   ※ 고객.도시는 외래 키로 도시.도시를 참조                            │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 3NF 분해는 이행적 종속성 "도시 → 도시코드"를 별도 테이블로 분리하는 것이다. 도시 테이블에서 도시가 기본 키가 되고, 도시코드가 결정된다. 고객 테이블에서는 도시가 외래 키가 되어 도시 테이블을 참조한다. 이제 도시코드 변경 시 고객 테이블에 영향을 주지 않고 도시 테이블만 수정하면 된다.


Ⅲ. 3NF vs BCNF

┌─────────────────────────────────────────────────────────────────────┐
│                    3NF와 BCNF 비교                                        │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   3NF 조건:                                                        │
│   • 2NF를 만족                                                     │
│   • 모든 비키 속성이 기본 키에 이행적으로 종속되지 않음                │
│                                                                     │
│   BCNF 조건:                                                       │
│   • 3NF를 만족                                                     │
│   • 모든 결정자가 후보 키이어야 함                                    │
│                                                                     │
│   차이:                                                            │
│   • 3NF: 기본 키가 아닌 결정자도 허용                                │
│   • BCNF: 모든 결정자가 후보 키 (모든 키는 기본 키이거나 후보 키)     │
│                                                                     │
│   상황:                                                            │
│   • 3NF에서 허용되지만 BCNF에서 허용되지 않는 경우:                  │
│   • A → B에서 A가 후보 키가 아닌 경우                                 │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘
  • **📢 섹션 요약 비유:**3NF는 "학번이 반을 결정하고, 반이 선생님을 결정하면" 선생님도 별도 표로 분리하는 것이고, BCNF는 더욱 엄격하게 "결정하는 것은 모두 키어야"라는 규칙을 추가한 것입니다.

📌 관련 개념 맵 (Knowledge Graph)

개념 명칭관계 및 시너지 설명
이행적 종속성기본 키 → 비키 → 비키로의 간접 종속으로, 3NF에서 제거 대상이다.
결정자다른 속성을 유일하게 결정하는 속성으로, BCNF에서는 반드시 후보 키어야 한다.
BCNF3NF보다 엄격한 정규형으로, 모든 결정자가 후보 키임을 요구한다.
외래 키3NF 분해 시 참조 무결성을 위해 필요한 키다.

👶 어린이를 위한 3줄 비유 설명

  1. 3NF는 "학번→반→선생님"에서 선생님을 별도 표로 분리하는 것과 같아요.
  2. 이렇게 하면 선생님이 바뀌어도 해당 반 정보만 수정하면 돼요.
  3. 컴퓨터에서도 이렇게 분리하면 (3NF 분해) 데이터를 더 안전하게管理할 수 있어요!