DB 정규화 (1NF ~ 5NF)

정규화

관계형 데이터베이스의 정규화데이터의 중복을 소거하고 무결성을 유지하는 과정을 뜻한다. 그리고 이러한 정규화를 정도에 따라 1NF, 2NF, 3NF, BDNF, 4NF, 5NF로 정의한다. 

 

Functional Dependancy (FD)

두 튜플 간의 관계를 함수형으로 정의한다. 

FD: X → Y 라면 X는 항상 하나의 Y를 결정할 수 있어야 한다. 


1NF

1NF 위반 사례

데이터가 단일 값(atomic)일 때, 1NF를 만족한다. atomic이란 원자와 같이 분해할 수 없는 하나의 속성 값을 뜻한다. 

이름 나이 취미
김철수 23 {축구, 코딩}

위 데이터는 [취미]가 여러 항목을 가지기 때문에 1NF를 만족하지 않는다. 

따라서 아래와 같이 데이터를 분리해 준다.

이름 나이
김철수 23
이름 취미
김철수 축구
김철수 코딩

2NF

2NF 위반 사례

2NF는 1NF를 만족하고 부분 종속을 허용하지 않는다. 즉, 'key의 부분 집합'이 'key 집합에 속하지 않는(non-prime) 속성'을 특정할 수 없어야 한다. 다시 말해 X → Y 에서 X는 key의 부분 집합이 아니여야 한다. 

상품명 제조사 분류 가격
납작만두 A 식품 11,800
납작만두 B 식품 15,900
초록쿠션 B 인테리어 13,900

 만약 key={상품명, 제조사} 라고 하자. 그런데 [분류]제조사와 관계없이 상품명에 따라 결정되어 버린다. 

  • key = {상품명, 제조사}
  • 상품명 → 분류

여기서 key의 부분 집합인 [상품명][분류]라는 속성을 지정해 버린다. 이 상황은 2NF를 위반한다. 따라서, 부분 종속되는 관계를 새로운 테이블로 분리해 준다. 

상품명 제조사 가격
상품명 분류

 


3NF

3NF 위반 사례

이행 종속(transitive dependency)이란, (X → Y) & (Y → Z)이면 X → Z가 성립하는 것을 말한다. 이 때문에 불필요한 종속성이 발생한다. 따라서 3NF는 2NF를 만족하고 이행 종속이 발생하지 않아야 한다. 

사번 이름 부서 근무 오피스
100231 김철수 DevOps 3F-04

key={사번}이지만 부서만 알아도 근무 오피스를 특정할 수 있다고 하자.

  • key = {사번}
  • 부서  근무 오피스

여기서 [사번]  [부서]  [근무 오피스]라는 이행 종속이 발생한다.  따라서 [부서]  [근무 오피스] 관계를 별도의 테이블로 분리해준다. 

사번 이름 부서
부서 근무 오피스

BCNF

BCNF 위반 사례

BCNF(Boyce-Codd Normal Form) Y 관계가 성립할 때, 모든 X는 Key여야 한다는 제약을 가지며 3NF를 만족한다. 다시 말해, key가 아닌 속성이 다른 속성을 결정해서는 안 된다. 

메뉴 가게 이름 가게 주소 가격
감자튀김 동네맥주 A-Street B32 9,800

key={메뉴, 가게_이름}이고, 가게 주소를 알면 가게 이름을 추론할 수 있다.

  • key = {메뉴, 가게_이름}
  • 가게 주소 → 가게 이름

하지만 [식당 주소]는 key에 속하지 않기 때문에 BCNF를 만족하지 않는다. 따라서 위반되는 관계를 별도의 테이블로 분리한다. 

메뉴 가게 이름 가격
가게 주소 가게 이름

4NF

4NF 위반 사례

4NF는 다치(multi-valued) 종속을 허용하지 않고, BCNF를 만족한다. 다치 종속이란 A  →→  B로 표현하며, 1:N의 관계를 뜻한다. 

과목 학번 과제
DB 2022011 ER Modeling
DB 2022011 Query
DB 2022011 PostgreSQL 실습
DB 2022379 ER Modeling
DB 2022379 Query
DB 2022379 PostgreSQL 실습

위 표는 DB 과목에서 모든 학생이 동일한 과제를 제출했다고 가정한다. [과목] 1개, [학번] 2개, [과제] 3개이지만 (1 x 2 x 3)해서 총 6개의 튜플이 만들어졌다. 이렇게 데이터의 중복이 발생하는 상황을 다치 종속이라고 한다. 

  • 과목 →→  학번
  • 과목 →  과제

위 관계에서 발생한 다치 종속도 별도의 테이블로 분리해준다. 

과목 학번 (수강 학생)
과목 과제

5NF

5NF 위반 사례

5NF는 4NF를 만족하고, Join을 통한 정보 손실이 없어야 한다. 데이터 정규화를 위해 데이터를 여러 개의 테이블로 분리한다. 그리고 다시 Join을 통해 데이터를 복원할 때 정보의 손실(loss)이 없어야 한다. 이때 정보를 잃는 것뿐만 아니라 잘못된 정보가 생성되는 것도 허용하지 않는다. 


문제점

정규화를 통해 테이블을 나누면 데이터를 복원할 때 JOIN 연산이 늘어나므로 성능에 영향을 준다. 따라서 처리 성능이 중요한 데이터에 대해 '반정규화(De-normalization)'하기도 한다.