관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 함
정규화의 기본 목표는 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현하는 것임
정규화된 결과를 정규형이라고 하며, 정규형은 기본 정규형, 고급 정규형으로 나뉨
기본 정규형 : 제 1 정규형, 제 2 정규형, 제 3 정규형, BCNF(보이스/코드 정규형)
고급 정규형 : 제 4 정규형, 제 5 정규형
정규화의 장점은 이상 현상의 발생 가능성을 줄이지만, 단점으로는 연산 시간이 증가함
릴레이션이 제 1 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형에 속함
제 1 정규형에 속하는 릴레이션이 제 2 정규형을 만족하게 하려면, 부분 함수 종속을 제거하고 모든 속성이 기본키에 완전 함수 종속되도록 릴레이션을 분해하는 정규화 과정을 거쳐야함
완전 함수 종속 : 어떤 속성이 기본키에 대해 완전히 종속일 때
부분 함수 종속 : 어떤 속성이 기본키가 아닌 다른 속성에 종속되거나, 기본키가 여러 속성으로 구성되어 있을 경우 기본키를 구성하는 속성 중 일부만 종속될 때
위의 릴레이션에서 Manufacturer와 Model이 키가 되고, 이를 통해 Model Full Name을 알 수 있음
Manufacturer Country는 Manufacturer에 종속적이지만, Model과는 연관관계가 없어서 제 2 정규화 조건을 만족 못함(부분 함수 종속)
그래서 이를 아래와 같이 릴레이션을 분리할 수 있음
릴레이션이 제 2 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제 3 정규형에 속함
이행적 함수 종속
A -> B, B -> C인 경우 A -> C가 성립될 때
즉 A를 알면 B를 알고 그를 통해 C를 알 수 있는 경우를 의미
위 릴레이션에서 Tournament와 Year가 기본키가 됨, Winner는 두 기본키로 구성된 복합키에 종속됨
여기서 Winner Date of Birth는 기본키가 아닌 Winner에 종속됨
이는 제 3 정규형을 위배하는 이행적 함수 종속이므로 이를 아래와 같이 분리할 수 있음
릴레이션의 함수 종속 관계에서 모든 결정자가 후보키이면 BCNF에 속함
하나의 릴레이션에 여러개의 후보키가 존재할 수도 있는데, 이런 경우는 제 3 정규형까지 모두 만족하더라도 이상 현상이 발생할 수 있음, 이러한 이상현상을 해결하기 위해 제 3 정규형보다 좀 더 엄격한 제약조건을 제시한 것이 BCNF임
위와 같이 제 3 정규형을 만족하여도 이상현상이 발생하는 경우가 있음
이때 새로운 교수가 특정 과목을 담당할 때 새로운 정보를 추가할 때 적어도 한 명 이상의 수강 학생이 필요한 삽입 이상이 생기고
학번 100이 C234 과목을 취소하면 P2가 C234 과목을 담당한다는 정보도 삭제되는 삭제 이상
마지막으로 P1의 과목이 변경되면 P1인 행을 모두 찾아 변경시켜주어야 하는 갱신 이상이 나타남
위와 같은 이상 현상이 발생하는 것은 결정자가 후보키로 취급되고 있지 않기 때문임
여기서 결정자란 한 값이 다른 값을 고유하게 결정할 수 있게 하는 것을 의미하는데 여기서 그 결정자가 후보키가 아님을 의미함
후보키는 슈퍼키 즉, 유일성을 만족하는 키 중 최소성을 갖는 키인데 위의 릴레이션에선 (학번,과목명), (학번,담당교수)가 후보키가 됨(담당교수만으로 후보키가 될 수 없음)
하지만 후보키가 아님에도 과목명을 결정할 수 있기 때문에 담당 교수가 결정자에 속함
그래서 이를 해결하기 위해서 모든 결정자는 후보키가 되도록 릴레이션을 아래와 같이 분해해서 BCNF를 만족할 수 있음
다치 종속?
다치 종속은 두 개의 독립된 속성이 1:N 관계로 대응하는 관계를 의미함
아래와 같이 하나의 회원번호에 주문도서가 하나가 아닌 상태를 다치 종속이라고 볼 수 있음
하지만 이로 인해 위의 테이블에서 회원번호와 이름이 중복되는 값이 만들어지는데 이것이 바로 다치 종속이 생겼다고 볼 수 있고 이를 제거하는 것이 제 4 정규형이라고 볼 수 있음
아래와 같이 제 4 정규형으로 두 개의 릴레이션으로 분리할 수 있음
조인 종속?
조인 종속이란 하나의 릴레이션을 여러개의 릴레이션으로 분해하였다가, 다시 조인했을 때 데이터 손실이 없고 필요없는 데이터가 생겨지는 것을 말함
일례로 아래와 같은 관계가 있음
여기서 한 명의 개발자는 여러 언어를 가질 수 있고 하나의 언어는 여러 개발자에 속할 수 있음
그리고 하나의 자격증은 여러 개발자에 속할 수 있고 한 명의 개발자가 여러 자격증을 소지할 수 있음
마지막으로 하나의 언어는 여러 자격증에 속할 수 있고 하나의 자격증은 여러 언어를 가질 수 있는 상태임
여기서 잘못된 조인을 통해 조인 종속이 발생하면 아래와 같이 됨
여기선 개발자와 자격증, 개발자와 언어는 관계가 있지만 자격증과 언어는 관계가 없음, 이렇게 연관성이 없는 조인이 발생한 것임, 조인 종속이 발생함
이를 제거하고 처리하면 제 5 정규형이 됨 아래와 같이 위에서 말한 관계대로 개발자 & 자격증, 개발자 & 언어, 자격증 & 언어로 묶여서 조인을 해서 릴레이션을 구성해서 조인 종속을 제거함
실제로 데이터베이스를 설계할 때 모든 릴레이션이 무조건 제 5 정규형에 속하도록 분해해야 하는 것은 아님, 오히려 그렇게 되면 비효율적인 경우가 많음
일반적으로 제 3 정규형이나 BCNF에 속하도록 릴레이션을 분해하여 데이터 중복을 줄이고 이상 현상이 발생하는 문제를 해결한다고 함