데이터베이스를 공부하면서 가장 외우기 힘든 개념 중에 하나는 정규화(normalization)이다. 이 포스트 하나로 정규화에 대한 모든 것을 이해할 수 있길 바란다.
정규화의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다. 정규화에는 제1정규화, 제2정규화, 제3정규화 등이 있다. 정규화에 대한 정의는 각 학자마다 다르다고 한다. 이 포스트에서는 일반적으로 통용되는 내용에 대해 설명하겠다.
제1정규화란 테이블의 컬럼이 원자값(atomic value)을 갖도록 테이블을 분해하는 것이다. 다음 테이블을 보자.
ID | 이름 | 상품 |
---|---|---|
1 | 김일성 | 립밤, 아이폰 |
2 | 김이성 | 바나나, 멜론 |
3 | 김삼성 | 물티슈 |
위 테이블은 상품 컬럼이 두 개 이상의 값을 가지므로 제1정규형이 아니다. 테이블을 다음과 같이 만들어 제1정규형을 만족시킬 수 있다.
ID | 이름 | 상품 |
---|---|---|
1 | 김일성 | 립밤 |
1 | 김일성 | 아이폰 |
2 | 김이성 | 바나나 |
2 | 김이성 | 멜론 |
3 | 김삼성 | 물티슈 |
제2정규화란 제1정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 완전 함수 종속(fully-functional dependency)이란 기본키(primary key)의 어떤 진부분집합(자기 자신이 아닌 부분집합)이 어떤 컬럼(column)의 결정자(determinant)가 되어선 안된다는 것을 의미한다. 이렇게 들으면 좀 어려운데 예시를 보면서 이해하자.
ID | 이름 | 상품 | 가격 |
---|---|---|---|
1 | 김일성 | 립밤 | 10000 |
1 | 김일성 | 아이폰 | 1750000 |
2 | 김이성 | 바나나 | 5000 |
2 | 김이성 | 멜론 | 10000 |
3 | 김삼성 | 물티슈 | 4000 |
기본키는 (ID, 상품)이라고 하자. 위 표에서 가격은 상품에 의해 결정된다. (상품은 유일하다고 하자. 다른 가격의 바나나는 없다.) 즉, 기본키의 부분집합(상품)이 가격을 결정하므로 이 테이블은 제2정규형이 아니다. 다음과 같이 테이블을 분해하면 제2정규형을 만족할 수 있다.
ID | 이름 | 상품 |
---|---|---|
1 | 김일성 | 립밤 |
1 | 김일성 | 아이폰 |
2 | 김이성 | 바나나 |
2 | 김이성 | 멜론 |
3 | 김삼성 | 물티슈 |
상품 | 가격 |
---|---|
립밤 | 10000 |
아이폰 | 1750000 |
바나나 | 5000 |
멜론 | 10000 |
물티슈 | 4000 |
제3정규화란 제2정규화를 진행한 테이블에 대해 이행적 종속(transitive dependency)을 없애도록 테이블을 분해하는 것이다.
이행적 종속 (Transitive Dependency)
서로 다른 집합 A, B, C이 있을 때, 다음
1. A -> B
2. B -> A가 아니다.
3. B -> C
을 만족하면 함수적 종속 A -> C는 이행적 종속이다.
다음 테이블이 있다고 하자.
상품 | 가격 | 원산지 | 원산지 국가 |
---|---|---|---|
립밤 | 10000 | 개성 | 한국 |
아이폰 | 1750000 | 정저우 | 중국 |
바나나 | 5000 | 엘 오로 | 에콰도르 |
멜론 | 10000 | 곡성 | 한국 |
물티슈 | 4000 | 시카고 | 미국 |
상품은 여기서도 유일하다고 생각하자. 이 테이블에서 기본키는 상품이다. 제2정규형은 만족한다. 그러나,
1. 상품이 원산지를 결정한다.
2. 원산지는 상품을 결정하지 않는다.
3. 원산지는 원산지 국가를 결정한다.
이기 때문에 이행적 종속이 있다. 이를 다음과 같이 제3정규화 할 수 있다.
상품 | 가격 | 원산지 |
---|---|---|
립밤 | 10000 | 개성 |
아이폰 | 1750000 | 정저우 |
바나나 | 5000 | 엘 오로 |
멜론 | 10000 | 곡성 |
물티슈 | 4000 | 시카고 |
원산지 | 원산지 국가 |
---|---|
개성 | 한국 |
정저우 | 중국 |
엘 오로 | 에콰도르 |
곡성 | 한국 |
시카고 | 미국 |