- 추상화 : 현실을 간략하게 표현
- 단순화 : 누구나 쉽게 이해할 수 있도록 표현
- 명확성 : 한가지 의미를 가지며, 명확하게 해석되어야 함
정의
데이터의 일관성 유지, 중복 최소화, 데이터 이상(Anomaly) 제거를 위해
데이터를 여러 테이블로 체계적으로 분해하는 과정
핵심: 속성의 원자성(Atomicity) 확보
한 칸에는 하나의 값만 들어가야 함
| 학번 | 이름 | 수강과목 |
|---|---|---|
| 1 | 홍길동 | DB, OS |
❌
수강과목에 여러 데이터가 들어있음
✅ 아래처럼 원자값으로 분리해야 함
| 학번 | 이름 | 수강과목 |
|---|---|---|
| 1 | 홍길동 | DB |
| 1 | 홍길동 | OS |
전제: 기본키가 복합키일 경우에만 해당
핵심: 기본키 일부에만 종속된 속성을 분리
→ 부분 함수 종속성(Partial Dependency) 제거
| 학번 | 과목코드 | 과목명 | 담당교수 |
|---|---|---|---|
| 1 | DB01 | 데이터베이스 | 김교수 |
| 2 | OS01 | 운영체제 | 이교수 |
과목명,담당교수는과목코드에만 종속됨
→ 아래처럼 테이블을 분리
📋 학생-과목 테이블
(학번, 과목코드)
| 학번 | 과목코드 |
|---|---|
| 1 | DB01 |
| 2 | OS01 |
📋 과목 테이블
(과목코드, 과목명, 담당교수)
| 과목코드 | 과목명 | 담당교수 |
|---|---|---|
| DB01 | 데이터베이스 | 김교수 |
| OS01 | 운영체제 | 이교수 |
핵심: 이행 함수 종속성(Transitive Dependency) 제거
→ 기본키가 아닌 컬럼이 다른 컬럼을 결정하지 않도록 함
| 학번 | 이름 | 학과코드 | 학과명 |
|---|---|---|---|
| 1 | 홍길동 | C01 | 컴퓨터공학과 |
학과명은학과코드에 종속,
학과코드는학번에 종속
→ 즉,학번 → 학과코드 → 학과명(이행 종속 발생)
📋 학생 테이블
(학번, 이름, 학과코드)
| 학번 | 이름 | 학과코드 |
|---|---|---|
| 1 | 홍길동 | C01 |
📋 학과 테이블
(학과코드, 학과명)
| 학과코드 | 학과명 |
|---|---|
| C01 | 컴퓨터공학과 |
핵심: 모든 결정자(Determinant) 는 후보키(Candidate Key) 여야 함
→ 후보키가 기본키를 종속시키는 경우 제거해야 함
| 교수 | 과목 | 강의실 |
|---|---|---|
| 김교수 | DB | 101호 |
| 김교수 | OS | 102호 |
한 교수가 여러 과목을 강의하지만
강의실이 교수마다 고정된다면
강의실 → 교수(역방향 종속) 발생
→ BCNF 위배 → 테이블 분리 필요
| 정규형 | 제거 대상 | 의미 | 예시 |
|---|---|---|---|
| ① 제1정규화 | 반복 속성 | 한 칸에 여러 값 금지 | DB, OS |
| ② 제2정규화 | 부분 함수 종속 | 복합키 일부에 종속 | 과목코드 → 과목명 |
| ③ 제3정규화 | 이행 함수 종속 | A→B, B→C | 학번 → 학과코드 → 학과명 |
| ④ BCNF | 비후보키 결정자 | 후보키가 기본키 종속 | 강의실 → 교수 |
✅ 정리 한 줄 요약
- 1NF: 원자성
- 2NF: 부분 종속 제거
- 3NF: 이행 종속 제거
- BCNF: 후보키 이외 결정자 제거