데이터베이스 정규화는 데이터를 효율적으로 관리하고 데이터 중복과 불일치를 방지하기 위해 데이터베이스를 여러 단계로 분리하는 과정입니다. 각 정규화 단계에서 테이블의 구조가 어떻게 변화하는지 예시 데이터를 통해 설명드리겠습니다.
### 제1정규화 (1NF: First Normal Form)
**제1정규화**는 테이블에 있는 모든 필드가 원자값(Atomic Value)을 가지도록 보장합니다. 즉, 각 칼럼은 하나의 값만을 가져야 합니다.
#### 예시:
정규화 전의 테이블:
| OrderID | CustomerName | ProductNames |
|---------|--------------|--------------------|
| 1 | Alice | Laptop, Mouse |
| 2 | Bob | Keyboard, Monitor |
이 테이블은 `ProductNames` 칼럼에 여러 값이 포함되어 있으므로 제1정규형이 아닙니다.
제1정규화된 테이블:
| OrderID | CustomerName | ProductName |
|---------|--------------|-------------|
| 1 | Alice | Laptop |
| 1 | Alice | Mouse |
| 2 | Bob | Keyboard |
| 2 | Bob | Monitor |
이제 각 칼럼은 원자값을 가지므로 제1정규형입니다.
### 제2정규화 (2NF: Second Normal Form)
**제2정규화**는 제1정규화가 적용된 상태에서, 부분적 함수 종속성을 제거하는 것입니다. 즉, 기본 키의 일부에만 종속된 속성을 제거합니다.
#### 예시:
제1정규화된 테이블:
| OrderID | CustomerName | ProductName | UnitPrice |
|---------|--------------|-------------|-----------|
| 1 | Alice | Laptop | 1000 |
| 1 | Alice | Mouse | 50 |
| 2 | Bob | Keyboard | 70 |
| 2 | Bob | Monitor | 150 |
이 테이블에서 `CustomerName`은 `OrderID`에만 종속되어 있으므로, 부분적 종속성이 발생합니다.
제2정규화된 테이블:
1. **Order** 테이블:
| OrderID | CustomerName |
|---------|--------------|
| 1 | Alice |
| 2 | Bob |
2. **OrderDetail** 테이블:
| OrderID | ProductName | UnitPrice |
|---------|-------------|-----------|
| 1 | Laptop | 1000 |
| 1 | Mouse | 50 |
| 2 | Keyboard | 70 |
| 2 | Monitor | 150 |
이렇게 분리하여 부분적 함수 종속성을 제거한 것이 제2정규화입니다.
### 제3정규화 (3NF: Third Normal Form)
**제3정규화**는 제2정규화가 적용된 상태에서, 이행적 함수 종속성을 제거하는 것입니다. 이행적 함수 종속성(Transitive Dependency)이란, 어떤 비기본 키 속성이 다른 비기본 키 속성에 종속될 때 발생합니다.
#### 예시:
제2정규화된 테이블:
| OrderID | CustomerID | CustomerName | CustomerAddress |
|---------|------------|--------------|-----------------|
| 1 | C001 | Alice | 123 Maple St. |
| 2 | C002 | Bob | 456 Oak St. |
이 테이블에서 `CustomerName`과 `CustomerAddress`는 `CustomerID`에 종속되어 있지만, `OrderID`와는 이행적 종속 관계가 있습니다. 이를 제거하여 제3정규화를 수행합니다.
제3정규화된 테이블:
1. **Order** 테이블:
| OrderID | CustomerID |
|---------|------------|
| 1 | C001 |
| 2 | C002 |
2. **Customer** 테이블:\
| CustomerID | CustomerName | CustomerAddress |
|------------|--------------|-----------------|
| C001 | Alice | 123 Maple St. |
| C002 | Bob | 456 Oak St. |
이렇게 이행적 종속성을 제거하여 제3정규형으로 만들었습니다.
### 제4정규화 (4NF: Fourth Normal Form)
**제4정규화**는 다치 종속성(Multi-Valued Dependency)을 제거하는 것입니다. 하나의 테이블에 두 개 이상의 독립적인 다치 종속이 있는 경우, 이를 분리하여 여러 테이블로 나누는 것을 의미합니다.
#### 예시:
정규화 전의 테이블:
| StudentID | Course | Hobby |
|-----------|-------------|-----------|
| S001 | Math | Swimming |
| S001 | Math | Reading |
| S001 | History | Swimming |
| S001 | History | Reading |
이 테이블에서 `Course`와 `Hobby`는 서로 독립적인 다치 종속 관계에 있습니다.
제4정규화된 테이블:
1. **StudentCourse** 테이블:
| StudentID | Course |
|-----------|---------|
| S001 | Math |
| S001 | History |
2. **StudentHobby** 테이블:
| StudentID | Hobby |
|-----------|----------|
| S001 | Swimming |
| S001 | Reading |
이렇게 두 개의 독립적인 다치 종속성을 분리하여 제4정규화가 이루어집니다.
### 요약
- **제1정규화**: 모든 속성이 원자값을 가져야 합니다.
- **제2정규화**: 부분적 함수 종속성을 제거하여 테이블을 분리합니다.
- **제3정규화**: 이행적 함수 종속성을 제거하여 테이블을 분리합니다.
- **제4정규화**: 다치 종속성을 제거하여 테이블을 분리합니다.
이러한 정규화 과정을 통해 데이터베이스의 무결성을 유지하고, 중복 데이터를 최소화하며, 효율적인 데이터 관리를 할 수 있습니다.