정규화 과정은 릴레이션 간의 잘못된 함수 종속 관계로 인해 데이터베이스 이상 현상이 일어나는 것을 해결하는 과정이자 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정입니다.
정규화의 목적
- 데이터 중복 최소화
- 이상 현상 방지
- 데이터 일관성 유지
- 저장 공간 효율화
이상 현상 (Anomaly)
데이터베이스의 설계를 잘못하게 되었을 때 불필요한 데이터 중복이 발생하여 릴레이션에 대한 데이터의 삽입, 갱신, 삭제 연산을 수행할 때 부작용이 발생하는 것을 말합니다.
삽입 이상 (Insertion Anomaly)
불필요한 데이터도 같이 삽입해야 하는 문제
비정규화 테이블:
┌─────────┬──────────┬──────────┬─────────┐
│ 학생ID │ 학생이름 │ 과목코드 │ 과목명 │
├─────────┼──────────┼──────────┼─────────┤
│ S001 │ 김철수 │ CS101 │ 자료구조 │
└─────────┴──────────┴──────────┴─────────┘
문제: 새로운 과목(CS102, 알고리즘)을 등록하려면
학생이 수강하지 않아도 학생 정보를 함께 입력해야 함
갱신 이상 (Update Anomaly)
중복 레코드가 있고 이 중 일부만 변경해 데이터 자체가 불일치되는 문제
┌─────────┬──────────┬──────────┬─────────┐
│ 학생ID │ 학생이름 │ 과목코드 │ 과목명 │
├─────────┼──────────┼──────────┼─────────┤
│ S001 │ 김철수 │ CS101 │ 자료구조 │
│ S002 │ 이영희 │ CS101 │ 자료구조 │
│ S003 │ 박민수 │ CS101 │ 자료구조 │
└─────────┴──────────┴──────────┴─────────┘
문제: 과목명을 "자료구조" → "데이터구조"로 변경 시
일부만 수정하면 데이터 불일치 발생
삭제 이상 (Deletion Anomaly)
레코드를 삭제하는데 필요한 데이터까지 함께 삭제되는 문제
┌─────────┬──────────┬──────────┬─────────┐
│ 학생ID │ 학생이름 │ 과목코드 │ 과목명 │
├─────────┼──────────┼──────────┼─────────┤
│ S001 │ 김철수 │ CS102 │ 알고리즘 │
└─────────┴──────────┴──────────┴─────────┘
문제: 김철수 학생이 수강 취소하면
CS102(알고리즘) 과목 정보도 함께 삭제됨
함수적 종속성 (Functional Dependency)
어떤 릴레이션을 구성하는 속성의 부분집합 X, Y가 있을 때, 하나의 X에 대해 Y가 하나라면 X가 Y를 함수적으로 결정한다 또는 Y가 X에 함수적으로 종속되어 있다는 관계를 말합니다.
표기법
X → Y
X: 결정자 (Determinant)
Y: 종속자 (Dependent)
예시
학번 → 학생이름
(학번이 결정되면 학생이름이 유일하게 결정됨)
주민등록번호 → 이름, 생년월일, 성별
(주민등록번호가 결정되면 나머지도 유일하게 결정됨)
정규형 (Normal Forms)
제1정규형 (1NF)
릴레이션의 모든 도메인이 더 이상 분해될 수 없는 원자 값만으로 구성되어야 합니다. 릴레이션의 속성 값 중에서 한 개의 기본키에 대해 두 개 이상의 값을 가지는 반복 집합이 있다면 제거하는 것을 말합니다.
제1정규형 위반:
┌─────────┬──────────┬──────────────────┐
│ 학생ID │ 학생이름 │ 수강과목 │
├─────────┼──────────┼──────────────────┤
│ S001 │ 김철수 │ 자료구조, 알고리즘 │ ← 반복 집합
└─────────┴──────────┴──────────────────┘
제1정규형 만족:
┌─────────┬──────────┬──────────┐
│ 학생ID │ 학생이름 │ 수강과목 │
├─────────┼──────────┼──────────┤
│ S001 │ 김철수 │ 자료구조 │
│ S001 │ 김철수 │ 알고리즘 │
└─────────┴──────────┴──────────┘
제2정규형 (2NF)
릴레이션이 제1정규형이며 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속된 것을 말합니다.
제2정규형 위반 (부분 함수 종속 존재):
기본키: (학생ID, 과목코드)
┌─────────┬──────────┬──────────┬─────────┐
│ 학생ID │ 과목코드 │ 학생이름 │ 과목명 │
├─────────┼──────────┼──────────┼─────────┤
│ S001 │ CS101 │ 김철수 │ 자료구조 │
└─────────┴──────────┴──────────┴─────────┘
문제:
학생ID → 학생이름 (부분 함수 종속)
과목코드 → 과목명 (부분 함수 종속)
제2정규형 만족 (테이블 분리):
학생 테이블:
┌─────────┬──────────┐
│ 학생ID │ 학생이름 │
├─────────┼──────────┤
│ S001 │ 김철수 │
└─────────┴──────────┘
과목 테이블:
┌──────────┬─────────┐
│ 과목코드 │ 과목명 │
├──────────┼─────────┤
│ CS101 │ 자료구조 │
└──────────┴─────────┘
수강 테이블:
┌─────────┬──────────┐
│ 학생ID │ 과목코드 │
├─────────┼──────────┤
│ S001 │ CS101 │
└─────────┴──────────┘
제3정규형 (3NF)
제2정규형이고 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속을 만족하지 않는 상태를 말합니다.
이행적 함수 종속 (Transitive Dependency)
A → B와 B → C가 존재하면 논리적으로 A → C가 성립하는데, 이때 집합 C가 집합 A에 이행적으로 함수 종속되었다고 합니다.
제3정규형 위반 (이행적 종속 존재):
학생 테이블:
┌─────────┬──────────┬──────────┬──────────┐
│ 학생ID │ 학생이름 │ 학과코드 │ 학과명 │
├─────────┼──────────┼──────────┼──────────┤
│ S001 │ 김철수 │ D001 │ 컴퓨터공학 │
└─────────┴──────────┴──────────┴──────────┘
함수 종속:
학생ID → 학과코드 → 학과명
(이행적 종속: 학생ID → 학과명)
제3정규형 만족:
학생 테이블:
┌─────────┬──────────┬──────────┐
│ 학생ID │ 학생이름 │ 학과코드 │
├─────────┼──────────┼──────────┤
│ S001 │ 김철수 │ D001 │
└─────────┴──────────┴──────────┘
학과 테이블:
┌──────────┬──────────┐
│ 학과코드 │ 학과명 │
├──────────┼──────────┤
│ D001 │ 컴퓨터공학 │
└──────────┴──────────┘
보이스-코드 정규형 (BCNF)
제3정규형이고 모든 결정자가 후보키인 상태를 말합니다. 보통 하나의 릴레이션에 여러 개의 후보키가 존재할 수 있는데, 이 경우에 제3정규형보다 엄격한 기준으로 제약을 건 것이 보이스-코드 정규형입니다.
BCNF 위반 (결정자가 후보키가 아님):
수강신청 테이블:
┌─────────┬──────────┬──────────┐
│ 학생ID │ 과목 │ 교수 │
├─────────┼──────────┼──────────┤
│ S001 │ 자료구조 │ 김교수 │
│ S002 │ 자료구조 │ 김교수 │
└─────────┴──────────┴──────────┘
함수 종속:
(학생ID, 과목) → 교수
교수 → 과목 (한 교수는 한 과목만 담당)
문제: '교수'가 결정자이지만 후보키가 아님
BCNF 만족:
수강신청 테이블:
┌─────────┬──────────┐
│ 학생ID │ 교수 │
├─────────┼──────────┤
│ S001 │ 김교수 │
│ S002 │ 김교수 │
└─────────┴──────────┘
교수-과목 테이블:
┌──────────┬──────────┐
│ 교수 │ 과목 │
├──────────┼──────────┤
│ 김교수 │ 자료구조 │
└──────────┴──────────┘
정규화 과정 요약
비정규 릴레이션
↓ (반복 집합 제거)
제1정규형 (1NF) - 원자값
↓ (부분 함수 종속 제거)
제2정규형 (2NF) - 완전 함수 종속
↓ (이행적 함수 종속 제거)
제3정규형 (3NF) - 이행적 종속 제거
↓ (모든 결정자를 후보키로)
보이스-코드 정규형 (BCNF)
정규화의 장단점
장점
- 데이터 중복 최소화
- 이상 현상 방지
- 데이터 일관성 유지
- 저장 공간 절약
단점
- JOIN 연산 증가 (성능 저하 가능)
- 쿼리 복잡도 증가
- 과도한 정규화 시 성능 문제
반정규화 (Denormalization)
정규화가 항상 정답은 아닙니다. 성능을 위해 의도적으로 중복을 허용하는 반정규화도 필요합니다.
반정규화 고려 시점
- JOIN 비용이 너무 높을 때
- 읽기 성능이 중요한 경우
- 데이터 변경이 거의 없는 경우
- 실시간 응답이 중요한 서비스
'ZeroBase > CS' 카테고리의 다른 글
| MySQL 스토리지 엔진(InnoDB vs MyISAM) (0) | 2025.10.16 |
|---|---|
| 데이터베이스 데드락 - 발생 조건과 해결 방법 (0) | 2025.10.12 |
| Clustered Index vs Non-Clustered Index (0) | 2025.09.30 |
| 데이터베이스 인덱스 - B-Tree와 성능 최적화 (0) | 2025.09.30 |
| 트랜잭션 격리 수준과 발생 가능한 현상 (0) | 2025.09.30 |