한 릴레이션(Relation)에 여러 엔티티의 속성을 혼합하면 정보가 중복 저장되며 저장 공간을 낭비하게 된다.
또 중복된 정보로 인해 '이상 현상'이 발생하게 된다. 이러한 문제를 해결하기 위해 정규화 과정을 거치는 것이다.
Attribute 간의 종속성으로 인한 이상현상이 발생하는 릴레이션을 분해하여 재디자인함으로써 이상현상을 없애는 과정
데이터의 중복 방지, 무결성을 충족하기 위해 데이터베이스를 설계하는 방법
정규화에는 아래와 같은 3가지 원칙이 있다.
정규화의 장점은 다음과 같다.
반면, 릴레이션의 분해로 인해 릴레이션간의 연산이 많아져 응답 시간이 오히려 느려질 수도 있는 단점이 있다.
이러한 경우 반정규화(De-normalization)을 통해서 성능을 향상시킬 수 있다.
반정규화(De-normalization)은 시스템의 성능 향상을 위해 정규화된 데이터 모델을 통합하는 작업으로, 의도적으로 정규화 원칙을 위배하는 행위이다. 따라서 정규화와 반정규화는 Trade-off 관계에 있다.
반정규화의 종류로는 테이블 통합/분할/추가, 중복 속성 추가 등이 있다.
반정규화를 수행하면 테이블이 단순해지고 관리 효율성이 증가하지만, 데이터의 일관성이나 무결성이 보장되지 않을 수 있다. 의도적으로 중복을 생성하여 검색 기능은 향상되지만, 갱신, 삭제 등의 성능은 낮아진다.
따라서 데이터의 중복 방지, 무결성 vs 데이터베이스의 성능, 단순화 사이의 우선순위를 잘 조절하여 정규화/반정규화를 수행해야 한다.
반정규화의 대상이 되는 경우는 다음과 같다.
함수 종속성(Functional Dependency)은 어떤 테이블의 속성 A와 B에 대하여, A값에 의해 B값이 유일하게 정해지는 관계를 말하며, "B는 A에 함수 종속이다"라고 한다. A→B의 기호로 나타낸다.
이때, A를 결정자(Determinant)라고 하고, B를 종속자(Dependant)라고 한다.
함수 종속성은 크게 완전 함수 종속과 부분 함수 종속, 이행적 함수 종속으로 나뉜다.
위와 같은 테이블이 있다고 하자. 여러 학생들이 있고 각 학생별로 여러 과목을 수강한다고 할 때, 위 테이블의 기본키는 (학번, 과목번호)가 될 것이다.
그렇다면, 이름과 학년은 학번만 알아도 유일하게 결정된다. 반면에 성적은 학번과 과목 번호를 모두 알아야 유일하게 결정된다. 따라서 그림으로 표현하면 다음과 같다.
그러므로, 학년과 이름은 (학번, 과목번호)에 대해 부분 함수 종속이고, 성적은 완전 함수 종속이다.
이렇게 엔티티를 구성하는 속성간의 함수 종속성을 판단하여 좋은 릴레이션인지 알 수 있다.
이상현상이란, 테이블 내의 데이터들이 불필요하게 중복되어 테이블을 조작할 때 발생되는 데이터 불일치 현상이다.
테이블을 잘못 설계하여 삽입, 삭제, 갱신할 때 오류가 발생하게 되는 것이다. 이상현상에는 크게 3가지 이상현상이 있으며, 정규화를 통해서 이상현상들을 해결할 수 있다.
위와 같은 테이블을 예로 들어 어떤 이상현상이 발생하는지 알아보자.