개념
•
관계형 데이터베이스에서 데이터 중복으로 인해 발생하는 이상현상을 제거하기 위해 속성들을 분해하는 작업
◦
이상 현상
▪
데이터 중복으로 인해 발생하는 현상
▪
종류
•
삽입 이상
◦
불필요한 데이터를 추가해야만, 원하는 데이터를 추가할 수 있는 경우
◦
예. PK == {학번, 강좌} 인 릴레이션
▪
학생 200이 어떤 강좌도 수강하지 않을 때 학생 200의 정보를 추가하기 위해선, 강좌 정보도 추가해야 함
▪
하지만 강좌정보는 PK이므로 Null이 될 수 없기 때문에, 굳이 “미수강”같은 불필요한 정보를 추가해야만 저장이 가능
•
삭제 이상
◦
필요한 데이터까지 삭제해야, 원하는 데이터를 삭제할 수 있는 경우
◦
예.
▪
데이터베이스의 강의실 정보를 삭제하기 위해선, 학생 100과 200이 데이터베이스를 수강한다는 정보까지 삭제해야 함
•
갱신 이상
◦
중복된 데이터 중 일부만 변경하여 데이터 불일치가 발생하는 경우
◦
예.
▪
데이터베이스 강좌의 강의실이 변경될 경우, 1행과 2행의 강의실 정보를 모두 변경하지 않고 일부만 변경될 경우 데이터 모순 발생
◦
정규화 대상이 되는 릴레이션
▪
속성 간, 함수적 종속성을 판단하고 그에 해당하는 정규형을 만족하지 못하는 릴레이션
•
함수적 종속성 (Functional Dependency)
◦
속성의 부분 집합 X, Y가 있을 때, X값에 따라 Y가 달라지는 경우
◦
Y는 X에 함수적 종속 이라고 하고, X(결정자) → Y(종속자)로 표현
◦
종류
▪
완전 함수적 종속 / 부분 함수적 종속 / 이행적 함수 종속
•
장점
◦
데이터 중복으로 인한 이상현상 제거
◦
DB 구조 확장 시, 구조 변경이나 수정이 적다 (유지 보수에 좋음)
•
단점
◦
릴레이션 분해로 인해 JOIN 증가 ⇒ 질의 응답 시간 느려짐
◦
단점 해결
▪
반정규화 (De-Normalization; 역정규화)
•
성능 향상을 위해, 데이터를 중복, 추가시키는 등 정규화에 반대되는 작업 수행
정규화 과정
•
제 n 정규화는 제 n-1 정규형을 이미 만족시킨 상태에서 수행
1.
제 1 정규형 (1NF)
•
컬럼값이 원자값(단일값)이어야 함
•
예
◦
제 1정규형을 만족시키지 못한 릴레이션 (PK == { 학생번호, 강좌이름 } )
▪
성적 컬럼에 원자값이 아니라 복수 데이터가 저장됨
◦
해결
•
제 1정규형에서 발생하는 이상현상
◦
삽입 이상
▪
100번 학생이 데이터베이스를 재수강하여 4.5를 받은 데이터를 추가하기 위해선, 이미 기존에 존재하는 강의실, 대여료 정보를 또 추가해야만 함
◦
삭제 이상
▪
100번 학생이 자료구조 강좌를 취소하면, 자료구조 강좌가 공학관 111호에서 열린다는 정보까지 다 삭제됨
◦
갱신 이상
▪
공학관 110호의 대여료를 변경하고 싶을 때, 1행, 2행의 대여료 정보를 모두 변경해야 함
•
제 1정규형에서 이상현상이 발생하는 이유
◦
기본키가 아닌 속성들이, 기본키에 완전 함수적 종속되지 않기 때문
▪
완전 함수적 종속 == 부분 함수적 종속이 없다
•
부분 함수적 종속성
◦
A라는 집합이 B를 결정 지을 때, A의 부분집합도 B를 결정지음
◦
ex. 기본키 부분집합인 강좌이름 → 강의실 & 강좌이름 → 대여료
2.
제 2 정규형 (2NF)
•
제 1 정규형을 만족시키면서, 기본키에 속하지 않은 속성들이 모두 기본키에 완전 함수적 종속됨
◦
즉, 기본키에 속하지 않은 속성들이 기본키에 완전 함수적 종속됨
▪
기본키의 부분집합이 결정자가 되면 안됨
•
예
◦
제 2정규형을 만족시키지 못하는 릴레이션
▪
기본키의 부분집합인 강좌이름이 강의실과 대여료를 결정지음
◦
해결
▪
릴레이션을 학생번호 + 강좌이름 + 성적 && 강좌이름 + 강의실 + 대여료 로 분리
•
제 2정규형에서 발생하는 이상현상
◦
삽입 이상
▪
강좌 릴레이션에, 대여료가 30,000원인 강의실 정보를 추가하고 싶을 때, 필요없는 강좌이름까지 추가해야 함
◦
삭제 이상
▪
강좌 릴레이션에서, 공학관 110호의 대여료 정보만 삭제하고 싶을 땐, 데이터베이스가 공학관 110호에서 열린다는 정보(강좌이름, 강의실)까지 삭제해야 함
◦
갱신 이상
▪
강좌 릴레이션에서, 공학관 110호의 강의실 대여료를 수정하려면, 1행과 3행의 대여료 정보를 모두 수정해야만 함
•
제 2정규형에서 이상현상이 발생하는 이유
◦
이행적 함수 종속된 속성이 있기 때문
▪
이행적 함수 종속성
•
속성1 → 속성2 → 속성3
•
ex. 강좌이름 → 강의실 → 강의실 대여료
3.
제 3 정규형 (3NF)
•
제 2 정규형을 만족하면서, 이행적 함수 종속성을 제거한 정규형
•
예
◦
제 3 정규형을 만족시키지 못하는 릴레이션
▪
강좌이름이 강의실을 결정하고, 강의실도 대여료를 결정함
◦
해결
▪
릴레이션을 강좌이름 + 강의실 & 강의실 + 대여료 로 분리
4.
BCNF
•
제 3 정규형을 강화한 개념
•
모든 결정자는 후보키여야 함
•
예
◦
BCNF 정규형을 만족시키지 못한 경우
▪
후보키가 될 수 없는 담당교수 속성이 과목명을 결정하고 있음
▪
제 3 정규형에서 발생하는 이상현상
•
삽입 이상
◦
새로운 교수가 특정 과목을 담당한다는 정보 추가 불가.
▪
적어도 1명의 수강학생이 필요함
•
삭제 이상
◦
학번 100이 C234과목을 취소하면, 교수 P2가 C234과목을 담당한다는 정보도 삭제됨
•
갱신 이상
◦
교수 P1의 과목이 변경되면 1행, 3행의 과목 정보를 모두 변경해야 함
◦
해결
▪
결정자인 담당교수가 후보키가 될 수 있게 분리
반정규화 / 역정규화
•
성능향상을 위해서 정규화된 테이블을 병합/분리하거나 데이터 중복/추가 등 정규화에 위배된 작업을 수행하는 것
•
필요한 경우
◦
Join이 많은 경우
▪
테이블 병합
◦
테이블 전체가 아니라, 특정 범위 데이터만 자주 처리하는 경우
▪
테이블 full scan을 줄이기 위해, 테이블을 수직/수평분할 하여 새로운 테이블 생성
◦
요약/집계 정보가 자주 조회되는 경우
▪
연산을 줄이기 위해, 이미 계산된 결과를 저장하는 컬럼을 추가로 생성
•
단점
◦
과도한 반정규화는 무결성을 해칠 수 있고, 속도를 느리게 만들 수 있음