📌 정규화(Normalization)란?

관계형 데이터베이스에서 중복을 최소화하고 이상현상(삽입이상, 갱신이상, 삭제이상)을 없애는 것

 

 📌 1차 정규화

테이블의 컬럼이 원자값을 가지도록 하는 것

 

<정규화 전>

이름 취미
한소희 독서, 쇼핑
천우희 노래, 춤
전여빈 게임

현재 한소희와 천우희의 취미를 보면 원자값이 아닌 다중값으로 들어가있기 때문에 1차 정규형을 만족하지 못한다.

따라서 1차 정규화를 진행한다.

 

<정규화 후>

이름 취미
한소희 독서
한소희 쇼핑
천우희 노래
천우희
전여빈 게임

 

 📌 2차 정규화

1차 정규화를 한 테이블이 완전 함수 종속을 만족하도록(= 부분 함수 종속이 없도록) 테이블을 분해하는 것

즉, 후보키가 복합키(다중칼럼)로 설정되어 있을 때 복합키의 일부칼럼에 다른칼럼들이 결정되어서는 안된다.

 

완전 함수적 종속과 부분 함수적 종속을 그림으로 나타내면 다음과 같다.

* 제1정규형 테이블의 기본키가 복합키가 아닌 단일키이면 자동으로 제2정규형을 만족한다.

 

테이블로 더 자세히 알아보자

 

<정규화 전>

이름 전화번호 과목 강의실 성적
한소희 010-1234-5678 데이터베이스 101 A+
이지은 010-2345-6789 운영체제 202 A0
한소희 010-1234-5678 파이썬 303 B+
천우희 010-3456-7890 데이터베이스 101 A0

현재 테이블에서 기본키를 (이름, 과목)으로 했을 때, 이 기본키는 전화번호, 강의실, 성적을 결정한다.

이 테이블은 위의 그림과 같이 완전 함수적 종속과 부분 함수적 종속이 모두 존재한다. 

 

성적 -> 완전 함수적 종속

- 이름만 봤을 때 결정되지 않음 (한소희라는 이름을 가지는 성적값은 A+, B+ 두 개)

- 과목만 봤을 때 결정되지 않음 (데이터베이스 과목의 성적 값은 A+, A0 두 개)

 

전화번호, 강의실 -> 부분 함수적 종속

- 이름만 봤을 때 전화번호가 결정됨 (과목을 볼 필요 없음)

- 과목만 봤을 때 강의실이 결정됨 (전화번호를 볼 필요 없음)

 

따라서 부분 함수적 종속을 없애기 위한 제2 정규화가 필요하다.

 

<정규화 후>

이름, 과목 -> 성적

이름 과목 성적
한소희 데이터베이스 A+
이지은 운영체제 A0
한소희 파이썬 B+
천우희 데이터베이스 A0

 

이름 -> 전화번호

이름 전화번호
한소희 010-1234-5678
이지은 010-2345-6789
천우희 010-3456-7890

 

과목 -> 강의실

과목 강의실
데이터베이스 101
운영체제 202
파이썬 303

 

 📌 3차 정규화

제 2정규형을 만족하는 테이블에 대해 이행 함수 종속이 없는 것

이행 함수 종속은 A -> B, B -> C가 성립할 때 A -> C가 성립 되는 것을 말한다.

 

이행 함수 종속을 그림으로 나타내면 다음과 같다.

상품번호가 기본키라고 했을 때 상품번호는 상품명, 가격, 판매자, 판매자 전화번호를 결정한다.

여기서 이행 함수 종속을 따져보면, 판매자는 판매자 전화번호를 결정한다.

따라서 상품번호 -> 판매자 -> 판매자 전화번호이기 때문에

판매자 -> 판매자 전화번호를 결정한다.

 

<정규화 전>

상품번호 상품명 가격 판매자 판매자 전화번호
1111 아이폰 14 600000 한소희 010-1234-5678
2222 LG 그램 1000000 이지은 010-2345-6789
3333 아이폰 14 pro 800000 한소희 010-1234-5678

이 테이블에서 상품번호에 따라 상품명, 가격, 판매자, 판매자 전화번호가 결정되지만,

판매자에 따라 판매자 전화번호도 결정된다.

 

이행 함수 종속을 삭제하기 위한 3차 정규화를 쉽게 하기 위해

이렇게 나눠주면 된다.

 

<정규화 후>

상품번호 상품명 가격 판매자
1111 아이폰 14 600000 한소희
2222 LG 그램 1000000 이지은
3333 아이폰 14 pro 800000 한소희
판매자 판매자 전화번호
한소희 010-1234-5678
이지은 010-2345-6789

 

 📌 보이스코드 정규화

3차 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것

즉, 식별자로 쓰이는 속성이 일반 속성에 종속되지 않아야 한다.

 

식별자로 쓰이는 속성이 일반 속성에 종속되는 것을 그림으로 나타내면 다음과 같다.

기본키를 (이름, 거주지)로 설정했을 때 기본키는 학교를 결정한다.

하지만 학교는 다시 거주지를 결정할 수 있을 때 보이스코드 정규화가 필요하다.

 

2차 정규화와 비슷해 보일 수 있는데,

2차 정규화는 복합키의 일부가 일반 속성을 결정하는 것이다.

 

보이스 코드 정규화를 테이블로 보면 다음과 같다.

<정규화 전>

이름 거주지 학교
고윤정 강남 서울여자대학교
김태희 강서 서울대학교
권정열 강남 연세대학교
한지민 강남 서울여자대학교

(이름, 거주지)는 학교를 결정한다.

하지만 학교도 거주지를 결정할 수 있다.

 

<정규화 후>

이름 거주지
고윤정 강남
김태희 강서
권정열 강남
한지민 강남
학교 거주지
서울여자대학교 강남
서울대학교 강서
연세대학교 강남

 

 📌 참고

https://jhnyang.tistory.com/360

https://developer111.tistory.com/10

https://mangkyu.tistory.com/110

+ Recent posts