정규화는 데이터 중복을 제거하고, 효율성을 향상시키며, 데이터 무결성을 보장하기 위해 릴레이션을 분리하는 행위를 말한다.
함수적 종속성(Functional Dependency, FD)
정규화에 대해 설명하기 전, 함수적 종속성에 대해 알아야한다. 함수적 종속성이란 어떤 릴레이션에서 속성의 부분집합을 X와 Y라고 할때, X의 값에 의해 Y값이 달라지는것을 Y는 X에 함수적 종속 이라고 한다. X->Y 형태로 나타낼 수 있으며, X를 결정자, Y를 종속자 라고 한다
여담으로, 정규화 내용으로 스터디를 진행하던 중, 함수적 종속성에서 결정자의 정의에 대해 논의한 적이 있다. 공부를 위해 다른 블로그를 참고해보면 결정자 설명에 기본키, 후보키 등의 키와 관련된 명칭이 자주 쓰여 혼란을 야기했다. 키 라고 설명하는 경우, 유일성과 최소성 제약으로 인해 개념이 많이 혼동되기때문에 명확히 해야한다. 결론적으로 결정자의 정의는 다음과 같다.
"릴레이션에서 다른 애트리뷰트(속성)를 고유하게 결정하는 하나 이상의 애트리뷰트" 논의하며 기록한 내용 중 일부
1) 완전 함수적 종속
X -> Y일때, X의 전체가 Y를 결정하는 경우
2) 부분 함수적 종속
X -> Y일때, X의 일부만으로도 Y가 결정되는 경우
3) 이행적 종속
X -> Y, Y -> Z 일때, X -> Z 도 성립하는 경우
정규화 종류
일반적으로는 BCNF정규화까지 한다고 하며, 정보처리기사(기능사)에서 이를 외우기 위해 아래와 같이 암기한다. 도->부->이->결->다->조
1) 1NF (제1 정규화)
속성의 값이 더 이상 나눌 수 없는 원자값이어야 함. 단일 값인 형태
아래의 표의 2, 3번 튜플의 속성처럼 한 속성에 여러 값을 가진 형태를 나누는 것을 1 정규형이라고 한다.
X
Y
1
한국
2
한국, 일본
3
일본, 중국
2) 2NF (제2 정규화)
부분 함수적 종속을 제거한 형태. 결정자 (X)를 분리한다.
아래와 같은 구조에서 (학생번호, 강좌이름) -> 성적, 강좌이름 -> 강의실의 종속을 가진다. 이러한 형태는 결정자 X인 (학생번호, 강좌이름)의 일부인 강좌이름인 강의실을 결정하기 때문에 부분 함수적 종속이 존재한다고 할 수 있다.
학생번호
강좌이름
강의실
성적
101
DB
401
A
102
DB
401
B
103
알고리즘
402
A
104
컴퓨터구조
403
A
101
컴퓨터구조
403
B
이를 제거한 형태는 아래처럼 수강 테이블, 강의실 테이블로 분해할 수 있다.
학생번호
강좌이름
성적
101
DB
A
102
DB
B
103
알고리즘
A
104
컴퓨터구조
A
101
컴퓨터구조
B
강좌이름
강의실
DB
401
알고리즘
402
컴퓨터구조
403
3) 3NF (제3 정규화)
이행적 종속을 제거한 형태. 기본 키 이외의 컬럼 간 종속성이 없어야 함. 아래 표에서 학생번호 -> 강좌이름 -> 수강료 구조가 이행적 종속이다. 예시를 위해 테이블 안의 값에 학생번호의 중복은 없다고 가정한다.
모든 결정자가 후보키가 되어야 함. 아래의 예시는 (학생번호, 특강이름)을 기본키이다. 이때 (학생번호, 특강이름) -> 교수 형태이지만, 교수 -> 특강의 함수 종속성이 생긴다. 교수 속성은 중복이 발생할 수 있는 후보키가 아닌 속성이므로 이를 분리하는 과정이 보이스 코드 정규화 이다.
학생번호
특강이름
교수
101
DB
김김김
101
알고리즘
이이이
102
DB
김김김
이를 분해하면 (학생번호 - 교수), (특강이름 - 교수)형태로 분리가 가능하다.
5) 4NF (제4 정규화)
다치 종속이 없어야 한다.
다치 종속이란?
X -> Y 일때 하나의 X값에 여러 개의 B 값이 존재하는 경우를 말한다.
6) 5NF (제5 정규화)
조인 종속이 없어야 한다. 하나의 릴레이션을 여러 개의 릴레이션으로 무손실 분해 했다가 다시 결합할 수 있는 형태를 말한다.