개요
데이터베이스에서 정규화 (Normalization) 는 테이블을 정리하여 중복 데이터를 최소화하고, 데이터 무결성을 보장하는 과정을 의미한다. 이를 통해 데이터 저장 용량을 줄이고, 삽입·갱신·삭제 이상(Anomaly) 현상을 해결할 수 있다.
정규화는 여러 단계가 존재하며, 대표적으로 1정규화(1NF), 2정규화(2NF), 3정규화(3NF), BCNF가 있다.
분류
- 제 1정규화
- 제 2정규화
- 제 3정규화
- BCNF
- 제 4정규화
- 제 5정규화
제 1정규화
테이블의 컬럼(속성)이 원자값을 갖도록 테이블을 분해하는 것이다.
- 각 컬럼이 하나의 속성만을 가져야 한다.
- 하나의 컬럼은 같은 종류나 타입의 값을 가져야 한다.
- 각 컬럼이 유일한 이름을 가져야 한다.
- 컬럼의 순서가 상관없어야 한다.
제 1 정규화 예시
Before
이름 | 나이 | 수강과목 |
---|---|---|
김 | 14 | C++ |
이 | 15 | DB, OS |
박 | 17 | Python, JAVA |
After
이름 | 나이 | 수강과목 |
---|---|---|
김 | 14 | C++ |
이 | 15 | DB |
이 | 15 | OS |
박 | 17 | Python |
박 | 17 | JAVA |
제 2정규화
제 1정규화를 진행한 테이블에 대해, 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. (완전 함수 종속 ⇒ 키본키의 부분집합이 결정자가 되어서는 안 된다.)
- 제 1정규화를 만족해야 한다.
- 모든 컬럼이 부분적 종속이 없어야 한다.
제 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가 성립되는 것)
- 제 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정규화에서의 이상현상 해결
- 제 3정규화를 만족해야 한다.
- 모든 결정자가 후보키 집합에 속해야 한다.
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정규화
- BCNF를 만족해야 한다.
- 다치 종속이 없어야 한다.
다치종속
- A → B일 때, 하나의 A값에 여러 B가 존재하면 다치 종속성을 가진다하며 A ↠ B 로 표시한다.
- 최소 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)
중복을 제거하기 위해 분해할 수 있는만큼 전부 분해한다.
- 제 4정규화를 만족해야 한다.
- Join 종속성이 없어야 한다.
- Join 연산을 했을 때, 손실이 없어야 한다.
JOIN 종속성이 있다?
Relation A를 Relation B와 C로 분해했는데, B와 C를 Join했더니 그대로 A가 되었다.