- 정규화는 이상현상이 발생하지 않는 릴레이션을 만들어 가는 과정이다.
- 정규화를 통해 릴레이션 분해 시 무손실 분해, 즉 분해로 인한 정보의 손실이 발생하지 않아야 한다.
- 정규형은 릴레이션이 정규화된 정도를 의미한다.
- 각 정규형마다 제약조건이 존재되며 차수가 높아질수록 제약조건이 높아진다.
- 정규형은 기본 정규형과 고급 정규형을 합해 총 6개 정규형으로 구분된다.
- 차수가 높아질수록 제약조건이 높은 것을 알 수 있다.
- 제 1 정규형은 릴레이션의 모든 속성의 도메인이 다중 값이 아닌 원자 값으로만 구성되어야 하는 것이 조건이다.
- 위 이벤트 참여 릴레이션에서 이벤트번호, 당첨여부 속성은 다중 값을 가지므로 제 1 정규형을 만족하지 않았다.
- 따라서 위의 다중 값을 모두 별개의 투플로 나눠 표현하면 제 1 정규형을 만족하게 된다.
- 그러나 제 1 정규형을 만족해도 데이터 중복으로 인해 이상 현상이 발생할 수 있다.
- 함수 종속 다이어그램으로 제 1 정규형은 만족하지만 이상현상이 발생하는 릴레이션을 표현한 것이다.
- 고객아이디와 이벤트번호가 당첨 여부를 결정한다.
- 고객아이디가 등급을 결정한다. 등급이 할인율을 결정하므로 고객아이디가 할인율을 결정하는 이행적 함수종속이 발생한다.
- 등급과 할인율이 기본키(고객아이디,이벤트번호)에 완전 함수 종속되지 못했으므로 이상 현상이 발생한다.
- 그러므로 릴레이션이 제 1 정규형에 속하고 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형을 만족한다.
- 위처럼 부분 함수 종속시 부분 함수 종속을 제거하여 릴레이션을 두개로 분해하면 제 2 정규형을 만족한다.
- 위처럼 이벤트 참여 릴레이션을 고객릴레이션과 이벤트참여 릴레이션으로 분해하여 제 2 정규형을 만족시킨다.
- 그러나 제 2 정규형을 만족해도 이상현상이 발생할 수 있다.
- 위와 같이 같은 등급별 할인율 차이 데이터 불일치로 인한 갱신 이상이 발생할 수 있다.
- 또 아이디를 지우는데, 해당 등급에 존재하는 아이디가 그 아이디 하나면 삭제 이상이 발생할 수 있다.
- 또 브론즈 등급을 생성하려는데 그에 해당하는 회원이 없으면 삽입 불가로 인한 삽입 이상이 발생한다.
- 이러한 이상 현상은 이행적 함수 종속의 존재로 발생하는 것이다.
- 따라서 제 3 정규형을 만족시키기 위해 이행적 함수 종속을 분해해야 한다.
- 릴레이션이 제 2 정규형에 속하고 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속되지 않으면 제 3 정규형을 만족한다.
- 고객아이디가 할인율을 이행적 함수 종속을 통해 결정하므로 제 3 정규형을 만족하지 못한다. 따라서 고객 릴레이션과 고객등급 릴레이션으로 분해시켜 이행적 함수 종속을 제거한다.
- 즉 두 릴레이션이 모두 제 3 정규형에 속하게 된다.
- 위 경우 어떤 이상이 발생할까?
- 먼저 학번과 과목번호가 기본키로 되어 있으므로 수강신청을 하지 않은 학생은 릴레이션에 삽입할 수 없어 삽입 이상이 발생한다. 임시 과목번호를 주어야만 삽입이 가능한 한계가 있다.
- 한 명의 학생이 여러 과목을 수강하면 중복되어 투플에 기재될 것이다. 만약 학생의 지도교수가 바뀌면 모든 투플이 갱신되어야 하는데, 일부만 갱신되면 갱신 이상이 발생한다.
- 만약 한 과목만 신청한 학생이 있을 때 릴레이션에서 그 학생의 투플이 하나인데 수강신청을 취소할 경우 투플이 사라진다. 투플 삭제시 학생 정보 및 과목정보가 사라지게 되므로 삭제 이상이 발생한다.
- 모든 릴레이션이 2정규형을 만족하도록 분해해보자
- 2정규형 만족을 위해 부분 함수 종속을 제거해야 한다. 과목번호와 학번, 성적을 별개의 릴레이션으로 분해한다.
- 2정규형 릴레이션을 3정규형을 만족하도록 분해해 보자.
- 이행적 함수 종속을 제거해야 한다. 학번->학과이름->학과전화번호, 학번->(회장이름,동아리이름)->방번호의 이행적 함수 종속을 제거해야 한다.
- 따라서 별도의 릴레이션을 구성해주어야 3정규형을 만족한다.