DB 정규화(Normalization)란 도대체 무엇인가

Choi Yeonung·2022년 9월 18일
0

데이터베이스를 공부하면서 가장 외우기 힘든 개념 중에 하나는 정규화(normalization)이다. 이 포스트 하나로 정규화에 대한 모든 것을 이해할 수 있길 바란다.

정규화의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다. 정규화에는 제1정규화, 제2정규화, 제3정규화 등이 있다. 정규화에 대한 정의는 각 학자마다 다르다고 한다. 이 포스트에서는 일반적으로 통용되는 내용에 대해 설명하겠다.


제1정규화

제1정규화란 테이블의 컬럼이 원자값(atomic value)을 갖도록 테이블을 분해하는 것이다. 다음 테이블을 보자.

ID이름상품
1김일성립밤, 아이폰
2김이성바나나, 멜론
3김삼성물티슈

위 테이블은 상품 컬럼이 두 개 이상의 값을 가지므로 제1정규형이 아니다. 테이블을 다음과 같이 만들어 제1정규형을 만족시킬 수 있다.

ID이름상품
1김일성립밤
1김일성아이폰
2김이성바나나
2김이성멜론
3김삼성물티슈

제2정규화

제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정규화

제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시카고
  • 원산지원산지 국가
    개성한국
    정저우중국
    엘 오로에콰도르
    곡성한국
    시카고미국
profile
Code as a hobby

0개의 댓글