[DB] 정규화
1. 정규화
- 이상현상이 발생하는 릴레이션을 분해하여 이상현상을 없애는 과정
- 이상현상이 있는 릴레이션은 이상현상을 일으키는 함수 종속성의 유형에 따라 등급을 구분 가능
- 릴레이션은 정규형 개념으로 구분하며, 정규형이 높을수록 이상현상은 줄어듦
- 정규화 정도는 항상 제 4정규형을 만드는 것이 옳지는 않음
- 집에 갈때 비행기를 타고가지 않듯, 자신의 상황에 맞춰 적당한 정규형을 선택하는 것이 좋다.
2. 제 1정규형
- 릴레이션 $R$의 모든 속성 값이 원자값을 가진 경우임
2.1. 제 1정규형으로 변환
고객취미들(이름, 취미들)
릴레이션을고객취미(이름, 취미)
릴레이션으로 바꾸어 저장하면 제 1정규형을 만족함
- 보통 릴레이션은 아무리 못해도 제1정규형을 만족하게 하는 것이 기본임
3. 제 2정규형
- 릴레이션 R이 제 1정규형이고 기본키가 아닌 속성이 기본키에 완전 함수 종속인 경우임
제 1정규형이 아니면 제 2정규형이 아니다!
- 완전 함수 종속(full functional dependency): A와 B가 릴레이션 R의 속성이고 A → B 종속성이 성립할 때, B가 A의 속성 전체에 함수 종속하고 부분 집합 속성에 함수 종속하지 않을 경우를 말함
3.1. 제 2정규형으로 변환
- 수강강좌 릴레이션에서 이상현상 일으키는
(강좌이름, 강의실)
을 분해함
4. 제 3정규형
릴레이션 R이 제 2정규형이고 기본키가 아닌 속성이 기본키에 비이행적(non-transitive)으로 종속할 때(직접 종속)를 말함
이행적 종속: A → B, B → C가 성립할 때 A → C가 성립되는 함수 종속성
4.1. 제 3정규형으로 변환
- 계절학기 릴레이션에서 이상현상을 일으키는
(강좌이름, 수강료)
를 분해함
5. BCNF 정규형
릴레이션 R에서 함수 종속성 X → Y가 성립할 때 모든 결정자 X가 후보키이면 BCNF(Boyce-Codd Normal Form) 정규형이라고 함
잘 됐는지 확인법: 분해한 테이블을 다시 조인했을 때 동일한 테이블이 된 경우(무손실 분해가 된 경우) BCNF가 잘 된 것임
5.1. BCNF 정규형으로 변환
- 모든 결정자가 존재하면 후보키가 있지만, 결정자가 없다면(아무 영향 없는 것을 묶는다면) BCNF를 적용할 수 있음
6. 무손실 분해
- 릴레이션 R을 릴레이션 R1과 R2로 분해할 때, R1
join
R2 = R이면 무손실 분해(lossless-join decomposition)라고 함 - R1 ∩ R2 → R1 혹은 R1 ∩ R2 → R2 중 하나를 만족해야 함
7. 정규화 정리
- 대부분의 릴레이션은 BCNF까지 정규화하면 실제적인 이상현상이 없어지기 때문에 보통 BCNF까지 정규화를 진행함.
테이블이 몇 정규형인지 확인할 때 절대 BCNF부터 확인하면 안되고, 1정규형부터 차근차근 확인해야 한다.
이 포스팅은 작성자의 CC BY-NC 4.0 라이선스를 준수합니다.