정규화란 잘못 설계된 관계형 스키마를 더 작은 속성의 세트로 쪼개어 바람직한 스키마로 만들어가는 과정이다. 바람직한 스키마로 만들어간다는 것은 데이터베이스 설계를 논리적으로 재구성한다는 것으로 이해하면 된다. 이렇게 정규화를 수행하면 불필요한 데이터를 없애거나 삽입/삭제 등의 쿼리 수행 시 발생할 수 있는 각종 이상현상을 방지할 수 있다.
하나의 종속성이 하나의 릴레이션에 표현될 수 있도록 분해해가는 과정
제1정규형, 제2정규형, 제3정규형, BCNF형, 제4정규형,제5정규형이 있음
차수가 높아질수록 만족시켜야 할 제약조건이 많아짐
정규화는 데이터베이스 논리적 설계 단계에서 수행함
데이터 구조의 안정성, 무결성을 유지
데이터 중복을 배제해 이상 발생 방지
자료 저장 공간의 최소화
데이터 삽입 시 릴레이션을 재구성할 필요성을 줄여줌
정규화를 거치리 않으면 데이터베이스 내의 데이터들이 불필요하게 중복되어 릴레이션 조작 시 이상 현상이 발생하게 된다. 이러한 이상의 종류에는 삽입이상, 삭제이상, 갱신이상이 있다.
- 아래 테이블의 경우, Adam의 Subject가 두개이기 때문에 1차정규형을 만족하지 못한다. 따라서 1차 정규화를 위해선 아래와 같이 1개의 행을 더 추가하게 된다. 혹은 Subject1, Subject2로 속성을 추가할 수도 있다.
- 1차 정규화 전
- 1차 정규화 후
- (Student+Subject)가 기본키가 될 수 있는데 Age의 경우 Student에 종속되어 있다. 그 이유는 Student 값을 알면, Age 값을 알 수 있기 때문이다. 따라서 2차 정규화를 위해선 아래와 같이 테이블을 쪼개야 한다.
- 2차 정규화 전
- 2차 정규화 후
- 아래 테이블의 경우 Student_id가 기본키인데 기본키 외의 속성을 봐보면 Street, City, State, Zip이 있다. 이 중 Zip 을 알면 Street, City, State가 결정되기 때문에 종속관계가 있다고 볼 수 있다.
- 3차 정규화 전
- 따라서 아래와 같이 테이블을 쪼갬으로써 3차 정규형을 만족시킬 수 있다. 즉, 기본키를 제외한 속성들 간에 이행적 함수 종속이 없게 되는 것이고 이 뜻은 기본키 외의 다른 속성이 그 외 다른 속성을 결정할 수 없다는 것이다.
- 3차 정규화 후
릴레이션에서 결정자가 모두 후보키인 정규형
강한 제3정규형이라고도 함
릴레이션 R의 모든 조인 종속이 R의 후보기를 통해서만 성립되는 정규형이다.
제1정규형 만족 : 모든 속성값이 원자값
제1정규형 -> 제2정규형 만족 : 부분적 함수 종속 제거 (=완전 함수 종속적이어야 함)
제2정규형 -> 제3정규형 만족 : 이행적 함수 종속 제거 (A->B, B->C일때, A->C인 것을 제거)
제3정규형 -> BCNF 만족 : 결정자이면서 후보키가 아닌 것 제거
BCNF -> 제4정규형 만족 : 다치 종속
제4정규형 -> 제5정규형 : 조인 종속성 이용