매번 헷갈리는 관계형 데이터베이스 정규화의 정의와 정규화의 단계별 특징에 대해 소개한다.
정규화(Nomalization)는 영어 원문에서 알 수 있듯 데이터베이스를 '정상적으로 만드는 것'이다. 그렇다면 데이터베이스의 세계에서 정상과 이상을 나누는 기준은 뭘까?
이 세계에서는 데이터의 불일치로 인해 삽입, 삭제, 갱신을 할 때 생기는 잘못된 현상을 이상 현상(Anomaly)이라고 부른다. 이상 현상이 생기는 주된 원인은 데이터의 중복이다. 따라서 정규화는 데이터의 중복을 제거하는 과정, 즉 이상 현상을 제거하는 과정이라고 보면 된다.
제 1정규화는 릴레이션의 속성값, 즉 도메인이 원자값으로 이뤄진 상태를 말한다. 여기서 원자값은 더는 쪼갤 수 없는 단위다. 보통 한 컬럼에 여러 개의 속성값이 들어가지 않은 상태를 말한다.
제 2정규화는 부분 함수 종속 제거한 상태다. 함수적 종속(Functional Dependency)이라는 용어를 풀어서 설명하면 속성들 사이에 함수적인 종속 관계가 있는지를 의미한다. 함수는 x에 따라 y의 값이 결정되는 관계를 의미한다. 따라서 A라는 속성이 있을 때, B라는 속성이 A에 따라 결정되면 B는 A에 함수적으로 종속된다고 말할 수 있다. 여기서 A는 결정자이고, B는 종속자라고 부른다.
제 2정규화부터는 함수적 종속을 제거하는 과정이라고 볼 수 있다.
이러한 설명을 바탕으로 부분 함수 종속을 이해해보자. A라는 기본키(Rrimary Key)가 있을 때, B가 기본키의 일부에 종속되거나 기본키가 아닌 다른 속성에 종속되는 경우가 부분 함수 종속이다. 여기서 기본키의 일부라는 표현이 헷갈릴 수 있는데, 기본키는 여러 개의 컬럼으로 구성될 수도 있다는 점을 유의하자.
예를 들어 한 릴레이션 안에 학번, 이름, 학년, 과목번호, 성적이라는 컬럼이 있다. 이 중에서 기본키를 고르자면 학번과 과목번호가 될 것이다. 기본키는 튜플을 유일하게 구별할 수 있는 최소 단위이기 때문이다.
이때 나머지 컬럼과 기본키의 관계를 보면 부분 함수 종속 관계 여부를 알 수 있다.
먼저 이름, 학년의 경우에는 과목번호를 몰라도 학번만 정해지면 알 수 있기 때문에 부분 함수 종속이다. 부분적으로 기본키에 종속되는 것이다. 반면 성적의 경우에는 학번만 안다고 해서 알 수 없고, 과목번호까지 알아야 한다. (어떤 과목의 성적인지 알아야 하기 때문) 부분 함수 종속은 특정 컬럼의 값을 알면 나머지 컬럼의 값도 알 수 있기 때문에 불필요한 중복이 발생한다는 점이다.
이와 같이 부분 함수 종속 관계가 있는 상태가 제 2정규형의 대상이 된다. 부분 함수 종속 관계를 제거하기 위해서는 학번, 이름, 학년을 하나의 테이블(학생 테이블)로 묶고, 학번, 과목번호, 성적을 하나의 테이블(성적 테이블)로 묶으면 부분 함수 종속이 제거된 상태가 된다. 이를 제 2정규화가 완료된 상태로 본다.
제 3정규화는 이행 함수적 종속 제거한 상태를 말한다. 이행적 함수 종속이란 A, B, C 컬럼이 있을 때 B가 A에 의해 결정되고, C가 B에 의해 결정되는데 C가 A에 의해서도 결정되는 경우를 말한다.
예를 들어 이름, 성별, 주소, 지역번호가 있는 테이블이 있을 때 이름, 성별은 기본키가 될 수 있다. 이때 주소는 기본키에 의해 결정되고 지역번호는 주소에 의해 결정되나 기본키에 의해서 결정될 수도 있다. 이를 이행 함수 종속이라고 한다.
이 상태를 제거한 것을 제 3정규화라고 부른다.
BCNF는 제 3정규화가 완료된 테이블에서 모든 결정자가 후보키 집합에 속하는 상태로 표현한다. 후보키란 기본키가 될 수 있는 후보가 되는 컬럼들을 말한다.
예를 들어 학번, 과목, 교수라는 컬럼으로 이뤄진 테이블이 있다. 과목에는 여러 교수가 포함될 수 있다. 이때 결정자가 될 수 있는 컬럼을 살펴보면 학번, 과목은 교수를 결정하고 교수는 과목을 결정한다. 하지만 학번, 과목은 후보키가 될 수 있지만 달리 교수는 후보키가 될 수 없다. (교수는 여러 학생, 즉 여러 학번을 가질 수 있기 때문에 유일한 튜플을 구별할 수 없다.) 이를 제거하면 BCNF를 만족하게 된다.
제 4정규화는 다치 종속(MultiValued Dependency)을 제거한 상태다.
제 5정규화는 조인 종속(Join Dependency)를 제거한 상태다.
보통 실무에서는 1~3 정규형까지 진행한다고 한다.