# [데이터베이스] 정규화

## 제 1정규화

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

1. 각 컬럼이 하나의 속성만을 가져야 한다.

2. 하나의 컬럼은 같은 종류나 타입의 값을 가져야 한다.

3. 각 컬럼이 유일한 이름을 가져야 한다.

4. 컬럼의 순서가 상관없어야 한다.

### 제 1 정규화 예시

**Before**

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

**After**

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

## 제 2정규화

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

1. 제 1정규화를 만족해야 한다.

2. 모든 컬럼이 부분적 종속이 없어야 한다.

### 제 2정규화 예시

**Before**

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

**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

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

| 학생코드 | 이름 | ZIP | Street | City | State |
| --- | --- | --- | --- | --- | --- |

**After**

| 학생코드 | 이름 | ZIP |
| --- | --- | --- |

| ZIP | Street | City | State |
| --- | --- | --- | --- |

## BCNF(Boyee-Codd Normal Form)

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

1. 제 3정규화를 만족해야 한다.

2. 모든 결정자가 후보키 집합에 속해야 한다.

### BCNF 예시

**Before**

| [학생] | [과목] | 교수 | 학점 |
| --- | --- | --- | --- |
| 1 | AB | X | A |
| 2 | CD | Y | A |
| 3 | CD | Y | A |

**After**

| 과목 | 교수 |
| --- | --- |
| AB | X |
| CD | Y |

| 학생 | 과목 | 학점 |
| --- | --- | --- |
| 1 | AB | A |
| 2 | CD | A |
| 3 | CD | A |

## 제 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 | 자바 | 노래 |
| A | C++ | 게임 |
| B | OS | 노래 |
| B | DB | 게임 |

학생 ↠ 과목
학생 ↠ 취미

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

**After**

| 학생 | 과목 |
| --- | --- |
| A | 자바 |
| A | C++ |
| B | OS |
| B | DB |

| 학생 | 취미 |
| --- | --- |
| 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가 되었다.

For the site tree, see the [root Markdown](https://slashpage.com/koa.md).
