데이터베이스 정규화(Database Normalization)
정규화 목적
- 데이터 중복 최소화
- 이상(Anomaly) 현상 방지
- 데이터 무결성(Integrity) 유지
비정규화 테이블 (이상 현상 발생)
학생수강 테이블
| 학번 |
학생명 |
학과 |
학과전화 |
과목코드 |
과목명 |
교수명 |
| 1001 |
김철수 |
컴공 |
02-1111 |
CS101 |
자료구조 |
박교수 |
| 1001 |
김철수 |
컴공 |
02-1111 |
CS102 |
알고리즘 |
이교수 |
| 1002 |
이영희 |
전자 |
02-2222 |
CS101 |
자료구조 |
박교수 |
문제점:
- 삽입 이상: 수강 없이 학생 등록 불가
- 삭제 이상: 수강 취소 시 학생 정보 삭제
- 갱신 이상: 학과전화 변경 시 여러 행 수정 필요
1차 정규형(1NF)
원자값(Atomic Value)만 허용
Before (1NF 위반)
| 학번 |
학생명 |
수강과목 |
| 1001 |
김철수 |
자료구조, 알고리즘 |
After (1NF)
| 학번 |
학생명 |
수강과목 |
| 1001 |
김철수 |
자료구조 |
| 1001 |
김철수 |
알고리즘 |
2차 정규형(2NF)
부분 함수 종속(Partial Dependency) 제거
- 기본키가 복합키일 때 적용
- 기본키 일부에만 종속되는 속성 분리
Before (1NF, 2NF 위반)
| 학번 |
과목코드 |
학생명 |
과목명 |
성적 |
| 1001 |
CS101 |
김철수 |
자료구조 |
A |
| 1001 |
CS102 |
김철수 |
알고리즘 |
B |
- 기본키: (학번, 과목코드)
- 학생명은 학번에만 종속
- 과목명은 과목코드에만 종속
After (2NF)
학생 테이블
과목 테이블
| 과목코드 |
과목명 |
| CS101 |
자료구조 |
| CS102 |
알고리즘 |
수강 테이블
| 학번 |
과목코드 |
성적 |
| 1001 |
CS101 |
A |
| 1001 |
CS102 |
B |
3차 정규형(3NF)
이행 함수 종속(Transitive Dependency) 제거
- A → B, B → C일 때 A → C 관계 제거
Before (2NF, 3NF 위반)
학생 테이블
| 학번 |
학생명 |
학과코드 |
학과명 |
학과전화 |
| 1001 |
김철수 |
CS |
컴공 |
02-1111 |
| 1002 |
이영희 |
EE |
전자 |
02-2222 |
- 학번 → 학과코드 → 학과명
- 학번 → 학과코드 → 학과전화
After (3NF)
학생 테이블
| 학번 |
학생명 |
학과코드 |
| 1001 |
김철수 |
CS |
| 1002 |
이영희 |
EE |
학과 테이블
| 학과코드 |
학과명 |
학과전화 |
| CS |
컴공 |
02-1111 |
| EE |
전자 |
02-2222 |
모든 결정자가 후보키
Before (3NF, BCNF 위반)
수강 테이블
| 학번 |
과목 |
교수 |
| 1001 |
DB |
김교수 |
| 1002 |
DB |
이교수 |
- (학번, 과목)이 기본키
- 하지만 교수 → 과목 (한 교수는 한 과목만 강의)
- 교수가 결정자이지만 후보키 아님
After (BCNF)
수강 테이블
교수과목 테이블
정규화 단계 요약
- 1NF: 원자값
- 2NF: 부분 종속 제거
- 3NF: 이행 종속 제거
- BCNF: 모든 결정자가 후보키
무결성 제약조건(Integrity Constraints)
1. 개체 무결성(Entity Integrity)
- 기본키(Primary Key)는 NULL 불가
- 기본키는 중복 불가
- 각 행을 고유하게 식별
2. 참조 무결성(Referential Integrity)
- 외래키(Foreign Key)는 참조 테이블의 기본키 값이거나 NULL
- 존재하지 않는 값 참조 불가
- ON DELETE/UPDATE 옵션:
- CASCADE: 연쇄 삭제/수정
- SET NULL: NULL로 설정
- RESTRICT: 거부
- NO ACTION: 아무 작업 안 함
3. 도메인 무결성(Domain Integrity)
- 속성(Attribute)의 값은 정의된 도메인(Domain) 범위 내
- 데이터 타입, 길이, 제약 준수
- CHECK 제약조건 사용
4. 키 무결성(Key Integrity)
- 각 릴레이션(Relation)은 최소 하나의 키 보유
- 고유 식별자 필요
5. NULL 무결성
- 특정 속성은 NULL 허용/불허 명시
- NOT NULL 제약조건
6. 고유 무결성(Unique Integrity)
- 특정 속성은 중복 값 불가
- UNIQUE 제약조건
7. 비즈니스 규칙 무결성
- 업무 규칙에 따른 제약
- 트리거(Trigger)로 구현
무결성 유지 방법
- 제약조건(Constraints): PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL
- 트리거(Trigger): 자동 실행되는 프로시저
- 트랜잭션(Transaction): ACID 속성 보장
함수적 종속
속성 집합에서 부분집합 X와 Y 있을때.
X가 정해지면 그에따라 Y값도 오직 하나로만 정해질 때
X->Y
X: 결정자, Y:종속자