데이터베이스 정규화는 DB를 설계하는 공식적인 방법이다. DB를 설계하는 방법의 기본이 되는 함수 종속(functional dependency)과 이를 사용해 정규화하는 방법을 알아보자.
FD(함수 종속)는 한 테이블에 있는 두 개의 attribute의 집합 사이의 제약이다.
이해를 위해 EMPLOYEE라는 임의의 테이블을 만들어 예로 들어보면
EMPLOYEE
empl_id | empl_name | birth_date | position | salary | dept_id |
---|
이때의 { empl_id }를 집합 X, { empl_name, birth_date, position, salary }가 집합 Y 라고 가정했을 때,
두 튜플의 X 값이 같다면 Y 값도 같다는 특징이 있다. 왜냐하면 empl_id는 임직원들 개인에게 부여되는 고유값일 텐데, empl_id가 같다면 그 값에 해당하는 속성들도 같을 것이기 때문이다.
이렇듯 X 값에 따라 Y 값이 유일하게 결정될 때, ‘X가 Y를 함수적으로 결정한다’ 라고 말할 수 있고, 이러한 두 집합 사이의 제약 관계를 functional dependency(FD) 라고 부른다.
테이블의 스키마를 보고 의미적으로 파악해야 한다.
즉, 테이블의 state를 보고 FD를 파악해서는 안된다.
다시 위의 EMPLOYEE 테이블로 예를들자면
EMPLOYEE
empl_id | empl_name | birth_date | position | salary | dept_id |
---|---|---|---|---|---|
… | John | 1997/03/05 | … | … | … |
… | Kim | 1998/02/05 | … | … | … |
… | Lee | 1999/01/05 | … | … | … |
FD를 파악할 때는 테이블의 state 즉, 테이블의 데이터를 보고 판단하면 안되는데 위의 데이터만 보면 empl_name과 birth_date 사이에 FD가 존재하는 것처럼 보인다. 하지만 empl_name에는 동명이인이 있을 수 있다. 그렇게 되면 같은 empl_name이지만 다른 birth_date를 가지게 되며 이는 더 이상 FD가 성립하지 않는 것을 보여준다.
데이터베이스 정규화는 데이터베이스 내의 데이터 구조를 조직화하고 최적화하는 과정이다. 정규화의 목적은 데이터 중복을 제거하고, 효율성을 향상시키며, 데이터 무결성을 보장하기 위함이다.
이러한 정규화에는 여러 단계가 있는데 보통 3NF 또는 BCNF까지만 정규화를 진행한다.
모든 정규화는 이전 정규화 단계를 만족해야 진행 가능하다.
제 1 정규화는 테이블의 컬럼이 원자값을 갖도록 테이블을 분해하는 것이다. 간단히 말해 모든 필드가 단일 값만을 가져야 하며, 중복된 컬럼이나 중첩된 레코드가 없어야 한다.
제 2 정규화는 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 예를 들어, 두 개의 컬럼이 결합되어 기본키가 된 composite key라면 비식별자(Non-Key-Attribute)가 두 컬럼 모두에게 종속되어야지 한 컬럼에만 종속되면 안된다.
제 3 정규화는 이행 종속성을 제거하여 데이터의 중복을 줄이는 것이다. 2NF를 만족하고, 비식별자가 다른 비식별자에게 종속되지 않아야 한다.
BCNF는 3NF에서 해결되지 않는 특정 종속성을 제거하여 데이터의 중복을 방지하는 것이다. 3NF를 만족하고, 모든 결정자가 후보키가 되어야 한다.
제 4 정규화는 다치 종속성(Multivalued Dependency)을 제거하는 것이다. BCNF를 만족하고, 다치 종속성을 갖지 않아야 한다.
제 5 정규화는 조인 종속성(Join Dependency)을 제거하여 데이터를 완전히 분리하는 것이다. 4NF를 만족하고, 조인 종속성을 갖지 않아야 한다.