BCNF (보이스-코드 정규형)

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

  1. 본질: BCNF (Boyce-Codd Normal Form)는 3NF보다 더 엄격한 정규형으로, 모든 결정자 (Determinant)가 후보 키 (Candidate Key)이어야 한다.
  2. 가치: BCNF는 3NF에서 허용되었던 결정자 문제를 해결하여, 갱신 이상의 추가 원인을 제거한다.
  3. 융합: BCNF는 특히多个候选键이 있거나 결정자 간复杂한 관계가 있는テーブル설계에서 중요하며,高度 정규화가 필요한 시스템에 적용된다.

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

개념 정의

BCNF (Boyce-Codd Normal Form)는 3NF를 만족하되, 모든 결정자가 후보 키인 정규형이다.

결정자 (Determinant)란?

결정자란 다른 속성을 유일하게 결정하는 속성이다. X → Y에서 X가 결정자다.

┌─────────────────────────────────────────────────────────────────────┐
│                    결정자와 후보 키                                       │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   예시:                                                            │
│   • 고객ID → (이름, 주소) → 고객ID가 결정자                          │
│   • 학번, 과목코드 → 성적 → (학번, 과목코드)가 결정자                  │
│                                                                     │
│   핵심 질문:                                                        │
│   • "X → Y"에서 X가 후보 키인가?                                    │
│   • X가 후보 키이면 모든 것이 정상                                     │
│   • X가 후보 키가 아니면 → BCNF 위반 가능성!                          │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

Ⅱ. BCNF 위반 사례

사례: 강의-학생-교수

┌─────────────────────────────────────────────────────────────────────┐
│                    BCNF 위반 사례                                        │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   [강의-학생-교수 테이블]                                            │
│   ┌──────────┬────────┬────────┐                               │
│   │ 강의코드   │ 학번   │ 교수명 │                               │
│   ├──────────┼────────┼────────┤                               │
│   │ L001     │ S001   │ 김교수 │                               │
│   │ L001     │ S002   │ 김교수 │                               │
│   │ L002     │ S001   │ 이교수 │                               │
│   │ L002     │ S003   │ 이교수 │                               │
│   └──────────┴────────┴────────┘                               │
│                                                                     │
│   종속성:                                                          │
│   • (강의코드, 학번) → 교수명 (复合键 → 非key)                    │
│   • 교수명 → 강의코드 (교수명이 강의코드를 결정!)                    │
│                                                                     │
│   ※ 교수명은 후보 키인가?                                           │
│   • 교수명이 강의코드를 결정하면 → 교수명도 결정자가 됨               │
│   • 그러나 교수명만으로 학번을 알 수 없음 → 교수명은 후보 키 아님!     │
│                                                                     │
│   → "교수명 → 강의코드"에서 교수명이 결정자이지만 후보 키가 아님     │
│   → BCNF 위반!                                                     │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

BCNF 위반의 문제

  1. 한 교수가 강의 코드를 변경하면 모든 행을 수정해야 함
  2. 새 교수의 강의 배정 정보 추가 시 학번이 필요
  3. 특정 교수의 모든 강의 삭제 시 교수 정보도 함께 삭제

Ⅲ. BCNF 분해

분해 후

┌─────────────────────────────────────────────────────────────────────┐
│                    BCNF 분해 후                                          │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   [수강] (기본 키: 강의코드 + 학번)                                   │
│   ┌──────────┬────────┐                                          │
│   │ 강의코드* │ 학번*  │                                          │
│   ├──────────┼────────┤                                          │
│   │ L001     │ S001   │                                          │
│   │ L001     │ S002   │                                          │
│   │ L002     │ S001   │                                          │
│   │ L002     │ S003   │                                          │
│   └──────────┴────────┘                                          │
│                                                                     │
│   [교수-강의] (기본 키: 교수명)                                      │
│   ┌────────┬──────────┐                                          │
│   │ 교수명* │ 강의코드  │                                          │
│   ├────────┼──────────┤                                          │
│   │ 김교수 │ L001     │                                          │
│   │ 이교수 │ L002     │                                          │
│   └────────┴──────────┘                                          │
│                                                                     │
│   ※ 손실 joins (Lossless Join) 보장: R1 ∩ R2 = {교수명}           │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

📌 관련 개념 맵 (Knowledge Graph)

개념 명칭관계 및 시너지 설명
결정자다른 속성을 유일하게 결정하는 속성으로, BCNF에서는 반드시 후보 키어야 한다.
후보 키기본 키가 될 수 있는 속성으로, 유일성과 최소성을 만족한다.
3NFBCNF의 기반이 되는 정규형으로, 일부 결정자 문제를 허용한다.
손실 조인분해 후 조인할 때 데이터가失われる可能性로, BCNF 분해는 항상 손실 조인 없음을 보장한다.

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

  1. BCNF는 "누가 누굴 가르치는지"를 정리하는 것이에요. "김선생님은 L001 강의를 맡는다"는 정보와 "L001 강의는 김선생님이 맡는다"는 정보를 함께 두면 문제가 생길 수 있어요.
  2. 그래서 "수강"과 "교수-강의"로 나누면 (BCNF 분해), 정보가 명확해져요.
  3. 이렇게 하면 강의가 바뀌어도 다른 정보에 영향 없이管理할 수 있어요!