정규화란 이상 문제를 해결하기 위해 속성들 끼리의 종속 관계를 분석하여 여러개의 릴레이션으로 분해하는 과정이다. 가장 큰 목표는 테이블 간 중복된 데이터를 허용하지 않는 것이다. 즉, 제약을 지키는 것이다.
한 릴레이션에 여러 엔티티의 애트리뷰트들을 혼합하게 되면 정보가 중복 저장되며, 저장 공간을 낭비하게 된다. 또 중복된 정보로 인해 갱신 이상이 발생하개 된다. 동일한 정보를 한 릴레이션에는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없게 되는 것이다. 따라서 정규화를 거치는 것이다.
예를들어 컬럼이 취미라고 한다면 취미에 (영화, 음악) 과 같이 두 개 이상의 값들을 넣었을 수도 있다. 이를 원자값(하나의 값)을 갖도록 테이블을 분리시키는 것이다. 그러면 취미에는 (영화, 음악)이 아닌 영화 또는 음악만 들어가게 된다.
따라서 위와 같이 결정자가 되는 강좌 이름을 분리시킨다. 그렇게 되면 강좌이름 -> 강의실을 가리키는 결정자가 된다. 그리고 본래 테이블에서 강의실을 분리한다.
즉 갑 -> 을 -> 병 같이 종속이 2개이상 생기는 경우를 말한다.
제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
학생번호와 특강이름이 교수를 결정하고 교수는 특강이름을 결정한다고 하자. 이럴경우 교수는 특강이름의 결정자이다. 하지만 교수는 후보키가 아니다. 즉 튜플을 유일하게 식별할 수 없다. 이럴 경우 학생번호와 교수, 특강이름과 교수로 테이블을 나눈다.
즉 결정자가 아닌 컬럼이 결정자 역할을 할 수 있을 때 분리하라는 것이다.
비정규화는 아예 정규화를 수행하지 않은 모델을 지칭할 때 사용한다. 반정규화를 정의하면 정규화된 정규화된 엔터티, 속성, 관계에 대해 시스템의 성능향상과 개발 및 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법을 의미한다. 협의의 반정규화는 데이터를 중복하여 성능을 향상시키기 위한 기법이라고 정의할 수 있고 더 넓은 의미의 반정규화는 성능을 향상시키기 위해 정규화된 모델에서 중복, 통합,분리 등을 수행하는 모든 과정을 의미한다.
데이터 무결성이 깨질 수 있는 위험을 감수하고 데이터를 중복하여 반정규화를 적용하는 이유는 데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하되거나 경로가 너무 멀어 조인으로 인한 성능저하가 예상되거나 컬름을 계산하여 읽을 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행한다.
기본적으로 정규화는 입력/수정/삭제에 대한 성능을 향상시킬 뿐 아니라 조회에 대해서도 성능을 향상시킬 수 있다. 하지만 정규화만을 수행하면 엔티티의 갯수가 증가하고 관계가 많아져 일부 여러 개의 조인이 걸려야 데이터를 가져오는 경우가 있다. 이러한 경우 업무적으로 조회의 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다. 또한 정규화의 함수적 종속관계는 위반하지 않지만 데이터의 중복성을 증가시켜야만 데이터 조회의 성능을 향상시키는 경우가 있다. 이럴 때 반정규화를 고려하면 좋다. 반정규화를 적용할때 기술적으로 수행하지 않으면 아래와 같은 문제가 발생한다.
반정규화도 하나의 난이도 높은 데이터 모델링 실무기술이다. 보통 프로젝트에선 칼럼 중복을 통해서만 반정규화를 수행한다. 컬럼의 반정규화가 많은 이유는 SQL문장 작성이 복잡해지고 이에 따라 SQL 단위 성능 저하가 예상되어 단순하기 처리하도록 하기위한 경우가 많다. 이렇게 무분별하게 컬럼의 반정규화를 하면 데이터에 대한 무결성을 깨뜨리는 결정적인 역할을 하는 경우가 많다.
반정규화를 적용할 때는 기본적으로 데이터의 무결성이 깨질 가능성이 많이 있기 때문에 반드시 데이터 무결성을 보장할 수 있는 방법을 고려하고 반정규화를 적용하도록 해야한다.