정규화
정규화란 이상현상(anomaly)이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이다.
정규화 과정을 진행하면 이상현상이 있는 릴레이션이 분해되어 여러 개의 릴레이션이 생성된다.
정규화를 통해서 이상현상을 제거하고, 추후에 새로운 데이터 형 추가시에도 일부만 변경해도 된다는 장점이 있다.
하지만, 릴레이션의 분해로 릴레이션 간의 JOIN 연산이 많아져서 성능저하가 발생할 수 있다.
비정규화 테이블
모든 정보를 저장하는 하나의 테이블을 가정해보겠다.
| 학생ID | 학생 이름 | 과목 | 선생님 | 선생님 이메일 |
|---|---|---|---|---|
| 1 | 홍길동 | 수학 | 김수학 | kim@school.com |
| 1 | 홍길동 | 과학 | 박과학 | park@school.com |
| 2 | 이순신 | 수학 | 김수학 | kim@school.com |
| 2 | 이순신 | 영어 | 최영어 | choi@school.com |
이 테이블은 중복 데이터가 많고, 삽입 이상, 삭제 이상, 수정 이상이 발생하기 쉽다.
정규형을 차례대로 적용해나가면 이상현상을 제거할 수 있다.
1NF (제1정규형)
모든 컬럼은 원자값만을 가져야 하며, 중복된 레코드가 없어야 한다.
| 학생ID | 학생 이름 | 과목 |
|---|---|---|
| 1 | 홍길동 | 수학, 과학 |
| 2 | 이순신 | 수학, 과학 |
원자 값을 가지도록 레코드를 분리해줘야한다.
| 학생ID | 학생 이름 | 과목 |
|---|---|---|
| 1 | 홍길동 | 수학 |
| 1 | 홍길동 | 과학 |
| 2 | 이순신 | 수학 |
| 2 | 이순신 | 영어 |
2NF (제2정규형)
1NF를 만족하면서, 모든 칼럼이 부분적 종속이 없어야 한다.
부분적 종속은 기본키 중에서 부분 컬럼에만 종속되는 것을 말한다.
즉, 모든 칼럼이 완전 함수 종속을 만족해야 한다.

기본 키를 학생ID와 과목의 조합으로 가정하면, 학생 이름은 학생ID에만 종속되고, 선생님 은 과목에 종속된다. 따라서 이를 분리해야 한다.
학생 테이블:
| 학생ID | 학생 이름 |
|---|---|
| 1 | 홍길동 |
| 2 | 이순신 |
수업 테이블:
| 학생ID | 과목 | 선생님 |
|---|---|---|
| 1 | 수학 | 김수학 |
| 1 | 과학 | 박과학 |
| 2 | 수학 | 김수학 |
| 2 | 영어 | 최영어 |
3NF (제3정규형)
3NF는 2NF를 만족하면서, 기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다.
A -> B, B -> 일 때 A -> C 가 성립하면 이행종속성이라고 한다.
| 학생ID | 과목 | 선생님 | 선생님 이메일 |
|---|---|---|---|
| 1 | 수학 | 김수학 | kim@school.com |
| 1 | 과학 | 박과학 | park@school.com |
| 2 | 수학 | 김수학 | kim@school.com |
| 2 | 영어 | 최영어 | choi@school.com |

선생님과 선생님 이메일은 이행 종속 관계에 있으므로, 선생님 정보를 별도의 테이블로 분리해야 합니다.
수업 테이블:
| 학생ID | 과목 | 선생님ID |
|---|---|---|
| 1 | 수학 | 1 |
| 1 | 과학 | 2 |
| 2 | 수학 | 1 |
| 2 | 영어 | 3 |
선생님 테이블:
| 선생님ID | 선생님 이름 | 선생님 이메일 |
|---|---|---|
| 1 | 김수학 | kim@school.com |
| 2 | 박과학 | park@school.com |
| 3 | 최영어 | choi@school.com |
BCNF(Boyce-Codd Normal Form)
3NF 를 만족해야하고, 모든 결정자가 후보키 집합에 속해야 한다.
아래의 테이블을 가정
| 과목 | 강의실 | 선생님 |
|---|---|---|
| 수학 | 101 | 김수학 |
| 과학 | 102 | 박과학 |
| 영어 | 101 | 최영어 |
이 테이블에서 '과목'이 '선생님'을 결정하고, '강의실'도 '선생님'을 결정할 수 있다고 가정해 보겠습니다. 즉, 과목에 따라 선생님이 정해지고, 특정 강의실에서는 특정 선생님이 강의한다는 것입니다.
이 경우, '과목 → 선생님'과 '강의실 → 선생님'이라는 두 가지 함수적 종속성이 존재한다. 그러나 '강의실'은 후보 키가 아니므로, 이 테이블은 BCNF를 만족하지 않는다.
BCNF를 만족시키기 위해, 함수적 종속성을 분리하여 두 개의 테이블로 나누어야 한다.
과목 테이블:
| 과목 | 선생님 |
|---|---|
| 수학 | 김수학 |
| 과학 | 박과학 |
| 영어 | 최영어 |
강의실 배정 테이블:
| 강의실 | 선생님 |
|---|---|
| 101 | 김수학 |
| 102 | 박과학 |
| 101 | 최영어 |
제4정규형, 제5정규형도 있지만 그 이상 정규화를 하면 정규화의 단점이 나타날 수 있어서 BCNF까지만 하는 경우가 많다.