정규화
정규화란 이상현상(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까지만 하는 경우가 많다.