정규화
- 정규화란 데이터 베이스를 설계할 때 중복을 최소화하는 것을 말하며, 크고 제대로 조직화되어 있지 않은 테이블(Table)과 관계들을 조직화된 테이블(Table)과 관계들로 나누는 것이다.
정규화가 필요한 경우
- 데이터를 갱신, 삽입, 삭제하는 등 테이블을 수정할 때 원하는 않게 데이터가 삭제되거나 가공되는 경우가 있다.
- 이를 이상 현상이라고 한다.
1. 갱신 이상
- 정확하지 않은 정보가 업데이트되거나, 일부의 정보만 업데이트되어 정보에 혼란이 생기고 모호해질 수 있다.

-
예를 들어 위의 예시처럼 항공편 데이터 베이스가 있다고 할 때, 항공사 별로 출발하는 게이트가 정해져 있다.
-
항공사명은 임의로 정한 것이다.
-
항공기의 개수가 여러 개이고, 출발하는 시간이 다르기 때문에 항공사별로 여러 개의 데이터가 존재한다. 만약, 위의 데이터베이스(DataBase)와 같이 AIRBUSAN의 Gate가 12E에서 16F로 업데이트되었다면 KE659에 해당하는 모든 데이터가 변경되어야 한다.
-
그러나, 일부만 변경되거나 업데이트가 잘못된다면 위와 같이 Gate가 다르게 나타날 수 있다.
-
이러한 갱신에서 발생할 수 있는 혼란을 '갱신 이상'이라고 한다.
2.삽입 이상
- 삽입 이상은 데이터가 일부만 작성될 경우 NULL 값이 발생하여 데이터가 추가되는 경우를 말한다.

-
위와 같이 JEJUAIR 항공사를 새로 추가하고 싶은데 아직 출발 시간이 정해지지 않았다.
-
그러면 Time 열(Column)에는 값이 없기 때문에 NULL값이 들어갈 수밖에 없다.
-
이처럼, 데이터가 불완전하게 삽입되는 경우를 '삽입 이상'이라고 한다.
3.삭제 이상
- 삭제를 하면서 그에 대한 모든 정보가 삭제되어 남아 있지 않게 되는 경우이다.

-
만약 DELTA 항공사의 USA 비행 스케줄이 취소됐다고 가정한다.
-
이때 USA 값을 삭제하고자 데이터를 삭제하면 DELTA 항공사의 정보마저 삭제된다.
-
그러면, DELTA 항공이 28B게이트를 이용한다는 정보마저 삭제되므로 데이터베이스(DataBase)에 이상이 생기게 된다.
-
이러한 경우를 '삭제 이상'이라고 한다.
정규화의 종류
1.1NF(제1 정규화)
- 테이블(Table) 안의 모든 값들은 단일 값이어야 한다.

-
위의 이미지는 1NF를 위배한 예시이다.
-
Arrival 열(Column)과 같이 여러 개의 값이 한 열(Column) 안에 들어가 있으면 데이터를 가공하기가 어렵다.
-
이러한 경우 테이블 안에 여러 개의 값을 저장하고 있으므로, 제1 정규성을 어긴다고 볼 수 있다.
-
제1 정규성을 위반하는 문제를 해결하기 위해서는 아래와 같이 테이블을 분리해서 하나를 만들어 주고, Arrival의 AircraftID를 외래 키(Foreign Key)로 설정하여 두 테이블 간의 참조 관계를 만들어준다.

2. 2NF(제2 정규화)
- 1NF 위배의 해결 방안으로 제2 정규화가 있다.
- 제2 정규화는 1NF를 만족하면서, 완전 함수 종속성을 가진 관계들로만 테이블을 만드는 것을 말한다.
함수 종속성
-
x값에 따라서 y값이 결정되는 경우 함수의 종속성이 있다고 한다.
-
다음과 같은 승객 데이터가 있다고 하면, Name에 따라서 그 사람의 성별(경칭)이 정해지고, Airline & Gate & Arrival에 따라서 출발 시간(Time)이 정해진다.
-
이때, Honorific은 Name에 함수 종속성이 있다고 하고, Time은 Airline & Gate & Arrival에 함수 종속성이 있다고 한다.

- 제2 정규화는 이러한 종속성들 중 종속 관계에 있는 열(Column)들끼리 테이블(Table)을 구분해 주는 것이다.
- 위의 데이터는 제1 정규화는 만족하기 때문에 남은 완전 함수 종속성을 가진 테이블들로 구분하여 제2 정규화를 충족시킨다.


3NF(제3 정규화)
-
제3 정규화는 제2 정규화를 만족하면서, 기본 키(Primary Key)에 대해 이행적 함수 종속이 되지 않는 것을 의미한다.
-
만약 Passenger 데이터에서 Gender가 추가되었다고 한다.
-
그러면 (Id, Name → Honorific → Gender)로 종속 관계를 가지게 된다.
-
이때, Gender는 기본 키(Primary Key)인 Id에 직접적인 종속 관계에 있지 않고 Honorific에 의해 정해지기 때문에 이행적 함수 종속관계에 있다고 한다.
-
따라서, 제3 정규화를 위반하게 된다.

- 따라서, 모든 열(Column)들이 기본 키(Primary Key)에 대해 직접적인 함수 종속성을 가지기 위해 세 개의 테이블(Table)로 나누어 정규화해주었다.



- 세 개의 테이블(Table)로 나눈 결과 각각 테이블(Table)이 기본 키(Primary Key)와 직접적인 함수 종속관계를 갖는 데이터로 정규화가 이루어졌다고 볼 수 있다.