정규화

정규화란 이상현상(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를 만족하면서, 모든 칼럼이 부분적 종속이 없어야 한다.

부분적 종속은 기본키 중에서 부분 컬럼에만 종속되는 것을 말한다.
즉, 모든 칼럼이 완전 함수 종속을 만족해야 한다.

Attachments/Picture/Pasted image 20240202203517.png|300
기본 키를 학생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

Pasted image 20240202204449.png|400

선생님선생님 이메일은 이행 종속 관계에 있으므로, 선생님 정보를 별도의 테이블로 분리해야 합니다.

수업 테이블:

학생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까지만 하는 경우가 많다.

reference