개요

데이터베이스에서 정규화 (Normalization) 는 테이블을 정리하여 중복 데이터를 최소화하고, 데이터 무결성을 보장하는 과정을 의미한다. 이를 통해 데이터 저장 용량을 줄이고, 삽입·갱신·삭제 이상(Anomaly) 현상을 해결할 수 있다.

정규화는 여러 단계가 존재하며, 대표적으로 1정규화(1NF), 2정규화(2NF), 3정규화(3NF), BCNF가 있다.

분류

  • 제 1정규화
  • 제 2정규화
  • 제 3정규화
  • BCNF
  • 제 4정규화
  • 제 5정규화

제 1정규화

테이블의 컬럼(속성)이 원자값을 갖도록 테이블을 분해하는 것이다.

  1. 각 컬럼이 하나의 속성만을 가져야 한다.
  2. 하나의 컬럼은 같은 종류나 타입의 값을 가져야 한다.
  3. 각 컬럼이 유일한 이름을 가져야 한다.
  4. 컬럼의 순서가 상관없어야 한다.

제 1 정규화 예시

Before

이름나이수강과목
14C++
15DB, OS
17Python, JAVA

After

이름나이수강과목
14C++
15DB
15OS
17Python
17JAVA

제 2정규화

제 1정규화를 진행한 테이블에 대해, 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. (완전 함수 종속 키본키의 부분집합이 결정자가 되어서는 안 된다.)

  1. 제 1정규화를 만족해야 한다.
  2. 모든 컬럼이 부분적 종속이 없어야 한다.

제 2정규화 예시

Before

이름나이수강과목
14C++
15DB
15OS
17Python
17JAVA

After

이름나이
14
15
17
이름수강과목
C++
DB
OS
Python
JAVA

제 3정규화

제 2정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. (이행적 종속 A → B, B → C가 성립할 때, A → C가 성립되는 것)

  1. 제 2정규화를 만족해야 한다.
  2. 기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다.

제 3정규화 예시

Before

학생코드 → ZIP ZIP → Street, City, State 학생코드 → Street, City, State

아래 테이블은 위와 같이 이행적 종속이 성립한다.

학생코드이름ZIPStreetCityState

After

학생코드이름ZIP
ZIPStreetCityState

BCNF(Boyee-Codd Normal Form)

제 3정규화 강화 버전, 제 3정규화에서의 이상현상 해결

  1. 제 3정규화를 만족해야 한다.
  2. 모든 결정자가 후보키 집합에 속해야 한다.

BCNF 예시

Before

[학생][과목]교수학점
1ABXA
2CDYA
3CDYA

After

과목교수
ABX
CDY
학생과목학점
1ABA
2CDA
3CDA

제 4정규화

  1. BCNF를 만족해야 한다.
  2. 다치 종속이 없어야 한다.

다치종속

  1. A → B일 때, 하나의 A값에 여러 B가 존재하면 다치 종속성을 가진다하며 A ↠ B 로 표시한다.
  2. 최소 3개의 컬럼이 존재한다.
  3. R(A, B, C)가 존재할 때, A와 B 사이에 다치 종속성이 있을 때, B와 C가 독립적이다.

제 4정규화 예시

Before

학생과목취미
A자바노래
AC++게임
BOS노래
BDB게임

학생 ↠ 과목 학생 ↠ 취미

로 다치 종속성을 가지지만, 과목과 취미는 각각 독립적이다.

After

학생과목
A자바
AC++
BOS
BDB
학생취미
A노래
A게임
B노래
B게임

제 5정규화(PJNF, Project Join Normal Form)

중복을 제거하기 위해 분해할 수 있는만큼 전부 분해한다.

  1. 제 4정규화를 만족해야 한다.
  2. Join 종속성이 없어야 한다.
  3. Join 연산을 했을 때, 손실이 없어야 한다.

JOIN 종속성이 있다?

Relation A를 Relation B와 C로 분해했는데, B와 C를 Join했더니 그대로 A가 되었다.

연관 페이지

참고 문헌 / 사이트