정규화
데이터베이스를 조작할 때, 잘못 설계된 테이블로 인해 이상현상이 발생할 수 있다. 이상현상은 삽입, 삭제, 수정 등의 과정에서 발생할 수 있으며, 이를 방지하기 위해 정규화라는 작업을 필요로 한다.
I. 이상현상
이상현상은 조작 작업에 따라 테이블의 일관성을 훼손하여 데이터 무결성을 깨드리는 현상이다. 이상현상은 다음 세가지로 나뉜다.
- 삽입 이상: 부득이한 NULL 입력, 중복 데이터 삽입
- 삭제 이상: 삭제 시 필요한 데이터가 함께 연쇄삭제
- 수정 이상: 수정 시 테이블의 속성 간 일관성이 깨짐
II. 함수 종속성
정규화를 위해 테이블을 분석해 기본키와 함수 종속성을 파악할 필요가 있다.
- 결정자: 다른 어떤 개념을 결정하는 역할
- 종속자: 결정자에 의해 결정되는 역할
예를 들어 한 테이블에 학과와 학과 사무실 속성이 있다면 학과 정보가 학과 사무실 정보를 결정한다고 할 수 있다. 이때 종속성은 학과 -> 학과 사무실 로 표기한다. A -> B 에서 A는 결정자, B는 종속자 라고 한다.
함수 종속성 규칙
- 부분집합 규칙: (학과, 주소) -> 학과
- 증가 규칙: 학생번호 -> 학생이름 ==> (학생번호, 강좌이름) -> (학생이름, 강좌이름)
- 이행 규칙: 학생번호 -> 학과, 학과 -> 학과사무실 ==> 학생번호 -> 학과사무실
- 결합 규칙: 학생번호 -> 학생이름, 학생번호 -> 주소 ==> 학생번호 -> (학생이름, 주소)
- 분해 규칙: 학생번호 -> (학생이름, 주소) ==> 학생번호 -> 학생이름, 학생번호 -> 주소
- 유사이행 규칙: 학생이름 -> 학생번호, (강좌이름, 학생번호) -> 성적 ==> (강좌이름, 학생이름) -> 성적
기본키 찾기
테이블에서 함수 종속성을 찾아내면 기본키를 정할 수 있다. 기본키는 정규화의 결정적인 단서가 되므로 중요하다. 예를 들어 학생(이름, 학과, 주소, 학점) 테이블이 있다고 가정하면 논리적으로 보았을 때 이름 속성이 나머지 세 속성을 결정한다고 볼 수 있다. 따라서 이름 속성이 테이블 전체를 결정하는 결정자라고 볼 수 있으며 이때 이름은 기본키 속성이 된다.
이상현상과 결정자
이상현상은 하나의 릴레이션에 두개 이상의 정보가 포함되어 있을 때 나타난다. 정확이 말하자면, 키본키가 아니면서 결정자인 속성이 있을 때 나타난다. 이를 해결하는 방법은 릴레이션 분리이다.
릴레이션 분리 예시
학생(이름, 학과, 주소, 강좌이름, 강의실)
이 경우 강좌이름이 강의실의 결정자이므로 이상현상이 발생할 수 있다. 따라서 다음과 같이 강좌 릴레이션으로 분리할 수 있다.
-> 학생(이름, 학과, 주소, 강좌이름) -> 강좌(강좌이름, 강의실)
III. 정규화
정규화는 릴레이션을 분리하여 이상현상을 없애는 작업이다. 정규화가 진행된 단계를 제1 정규형 ~ 제4 정규형으로 구분한다. 정규형 등급이 높을수록 이상현상이 발생하지 않는다.
제1 정규형
모든 속성값이 원자값을 가지면 제1 정규형이다.
제1 정규형이 아닌 릴레이션은 다음과 같다.
| 이름 | 취미 |
|---|---|
| 김연아 | 인터넷 |
| 추신수 | 영화, 음악 |
| 박세리 | 음악, 쇼핑 |
| 김연경 | 음악 |
원자값을 갖도록 릴레이션을 수정하면 다음과 같다.
| 이름 | 취미 |
|---|---|
| 김연아 | 인터넷 |
| 추신수 | 영화 |
| 추신수 | 음악 |
| 박세리 | 음악 |
| 박세리 | 쇼핑 |
| 김연경 | 음악 |
제2 정규형
릴레이션이 제1 정규형을 만족하며, 기본키가 아닌 속성이 기본키에 완전 종속일 때 제2 정규형이다. 예를 들어 다음과 같은 릴레이션이 있다고 해보자.
| 학생번호 | 강좌이름 | 강의실 | 성적 |
|---|---|---|---|
| 501 | 데이터베이스 | 110호 | 3.5 |
| 401 | 데이터베이스 | 110호 | 4.0 |
| 402 | 스포츠경영학 | 103호 | 3.5 |
이 릴레이션의 기본키는 (학생번호, 강좌이름)이다. 하지만 강의실 속성의 경우 학생번호가 없어도 강좌 이름에 종속적이다. 즉 이는 기본키가 아닌 속성이 기본키에 완전 종속이 아닌, 불완전 종속인것이다. 이는 이상현상을 유발한다.
따라서 이 릴레이션을 다음과 같이 분해할 수 있다.
| 학생번호 | 강좌이름 | 성적 |
|---|---|---|
| 501 | 데이터베이스 | 3.5 |
| 401 | 데이터베이스 | 4.0 |
| 402 | 스포츠경영학 | 3.5 |
| 강좌이름 | 강의실 |
|---|---|
| 데이터베이스 | 110호 |
| 데이터베이스 | 110호 |
| 스포츠경영학 | 103호 |
이렇게 하면 제 2정규형을 만족하게 된다.
제3 정규형
릴레이션이 제2 정규형을 만족하며, 기본키가 아닌 속성들이 이행적으로 종속하지 않으면 제3 정규형이다.
예를 들어 다음과 같은 릴레이션이 있다고 해보자.
| 학생번호 | 강좌이름 | 수강료 |
|---|---|---|
| 401 | 데이터베이스 | 20000 |
| 402 | 스포츠경영학 | 15000 |
| 502 | 자료구조 | 25000 |
이 릴레이션에선 강좌 이름이 학생 번호에 종속되고, 수강료는 강좌 이름에 종속된다. 즉 학생번호 -> 강좌이름 -> 수강료
따라서 이 릴레이션을 다음과 같이 분리하여 정규화한다.
| 학생번호 | 강좌이름 |
|---|---|
| 401 | 데이터베이스 |
| 402 | 스포츠경영학 |
| 502 | 자료구조 |
| 강좌이름 | 수강료 |
|---|---|
| 데이터베이스 | 20000 |
| 스포츠경영학 | 15000 |
| 자료구조 | 25000 |
BCNF
제3 정규형을 보완해 모든 결정자가 후보키가 되도록 릴레이션을 분해한 것이다.
무손실 분해
분해한 릴레이션을 다시 공통된 속성으로 조인할 때, 분해 전의 릴레이션과 같으면 무손실 분해를 만족한다.