기존에 Databse 정규화와 비정규화를 알고 있었다. 하지만 그게 어떻게 사용이 되고 왜 사용하는지 잘 몰랐고, 이직을 준비하면서 알아야할 거 같아서 정리를 하기로 한다. (정규화와 비정규화 둘을 나눠서 정리를 하려한다.)
관계형 데이터베이스 설계에서 중복을 최소화하기 위해서 데이터를 구조화하는 프로세스를 정규화라고 한다. 정규화 기본 목표는 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현하는 것이다.
정규화 결과를 정규형이라고 하며, 정규형은 기본 정규형과 고급 정규형으로 나뉜다.
제 1 정규형은 다음과 같은 규칙들을 지켜야한다.
- 각 컬럼이 하나의 속성만을 가져야한다.
- 하나의 컬럼은 같은 종류나 Type의 값을 가져야한다.
- 각 컬럼이 유일한 이름을 가져야한다.
- 컬럼의 순서가 상관없야한다.
제 2 정규형은 다음과 같은 규칙을 만족해야한다.
- 1 정규형을 만족한다.
- 모든 컬럼이 부분적 종속이 없어야한다. (모든 컬럼이 완전 함수 종속을 만족한다.)
부분적 종속 : 기본키 중 특정 컬럼에만 종속이 되는 것.
완전 함수 종속 : 기본키의 부분집합이 결정자가 되어선 안된다.
제 3 정규형은 다음과 같은 규칙을 만족해야한다.
- 2 정규형을 만족한다.
- 기본키를 제외한 속성들 간의 이행 종속성이 없어야한다.
이행 종속성은 A -> B, B -> C 일 때 A -> C가 성립이 되면 이행 종속이라고 한다. 즉, A를 알면 B를 알고, 이를 통해서 C를 알 수 있는 경우를 의미.
릴레이션의 함수 종속 관계에서 모든 결정자가 후보키면 BCNF에 속한다.
하나의 릴레이션에 여러개의 후보키가 존재할 수 있는데, 이련 경우 제 3 정규형까지 모두 만족하더라도 이상 현상이 발생할 수 있다. 이러한 이상현상을 해결하기 위해서 제 3 정규형보다 좀 더 염격한 제약 족건을 제시한 것이 BCNF다.
실제로 DB 설계 시 모든 릴레이션이 무조건 제 5 정규형에 속하도록 분리해야 하는 것은 아니다. 오히려 그렇게 되면 비효율적인 경우가 많기 때문이다.
일반적 제 3 정규형이나 BCNF에 속하도록 릴레이션을 분해하여 데이터 중복을 줄이고 이상 현상이 발생하는 문제를 해결한다.