BCNF (보이스-코드 정규형)
핵심 인사이트 (3줄 요약)
- 본질: BCNF (Boyce-Codd Normal Form)는 3NF보다 더 엄격한 정규형으로, 모든 결정자 (Determinant)가 후보 키 (Candidate Key)이어야 한다.
- 가치: BCNF는 3NF에서 허용되었던 결정자 문제를 해결하여, 갱신 이상의 추가 원인을 제거한다.
- 융합: 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 위반의 문제
- 한 교수가 강의 코드를 변경하면 모든 행을 수정해야 함
- 새 교수의 강의 배정 정보 추가 시 학번이 필요
- 특정 교수의 모든 강의 삭제 시 교수 정보도 함께 삭제
Ⅲ. BCNF 분해
분해 후
┌─────────────────────────────────────────────────────────────────────┐
│ BCNF 분해 후 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ [수강] (기본 키: 강의코드 + 학번) │
│ ┌──────────┬────────┐ │
│ │ 강의코드* │ 학번* │ │
│ ├──────────┼────────┤ │
│ │ L001 │ S001 │ │
│ │ L001 │ S002 │ │
│ │ L002 │ S001 │ │
│ │ L002 │ S003 │ │
│ └──────────┴────────┘ │
│ │
│ [교수-강의] (기본 키: 교수명) │
│ ┌────────┬──────────┐ │
│ │ 교수명* │ 강의코드 │ │
│ ├────────┼──────────┤ │
│ │ 김교수 │ L001 │ │
│ │ 이교수 │ L002 │ │
│ └────────┴──────────┘ │
│ │
│ ※ 손실 joins (Lossless Join) 보장: R1 ∩ R2 = {교수명} │
│ │
└─────────────────────────────────────────────────────────────────────┘
📌 관련 개념 맵 (Knowledge Graph)
| 개념 명칭 | 관계 및 시너지 설명 |
|---|---|
| 결정자 | 다른 속성을 유일하게 결정하는 속성으로, BCNF에서는 반드시 후보 키어야 한다. |
| 후보 키 | 기본 키가 될 수 있는 속성으로, 유일성과 최소성을 만족한다. |
| 3NF | BCNF의 기반이 되는 정규형으로, 일부 결정자 문제를 허용한다. |
| 손실 조인 | 분해 후 조인할 때 데이터가失われる可能性로, BCNF 분해는 항상 손실 조인 없음을 보장한다. |
👶 어린이를 위한 3줄 비유 설명
- BCNF는 "누가 누굴 가르치는지"를 정리하는 것이에요. "김선생님은 L001 강의를 맡는다"는 정보와 "L001 강의는 김선생님이 맡는다"는 정보를 함께 두면 문제가 생길 수 있어요.
- 그래서 "수강"과 "교수-강의"로 나누면 (BCNF 분해), 정보가 명확해져요.
- 이렇게 하면 강의가 바뀌어도 다른 정보에 영향 없이管理할 수 있어요!