- 데이터 정규화
정규화란 데이터 베이스를 설계할 때 중복을 최소화하는 것을 말하며, 크고 제대로 조직화되어 있지 않은 테이블과 관계들을 조직화된 테이블과 관계들로 나누는 것이다.
- 정규화가 필요한 경우
데이터를 갱신, 삽입, 삭제하는 등 테이블을 수정할 때 원하는 않게 데이터가 삭제되거나 가공되는 경우가 있다. 이를 이상 현상이라고 한다.
1) 갱신 이상
정확하지 않은 정보가 업데이트되거나, 일부의 정보만 업데이트되어 정보에 혼란이 생기고 모호해질 수 있다.
항공편 데이터 베이스가 있다고 할 때, 항공사 별로 출발하는 게이트가 정해져 있다고 하자. (항공사명은 임의로 정한 것이다!) 항공기의 개수가 여러 개이고, 출발하는 시간이 다르기 때문에 항공사별로 여러 개의 데이터가 존재한다. 만약, 위의 데이터 베이스와 같이 AIRBUSAN의 Gate가 12E에서 16F로 업데이트되었다면 KE659에 해당하는 모든 데이터가 변경되어야 한다. 그러나, 일부만 변경되거나 업데이트가 잘못된다면 위와 같이 Gate가 다르게 나타날 수 있다. 이러한 갱신에서 발생할 수 있는 혼란을 '갱신 이상'이라고 한다.
2) 삽입 이상
삽입 이상은 데이터가 일부만 작성될 경우 NULL 값이 발생하여 데이터가 추가되는 경우를 말한다.
위와 같이 JEJUAIR 항공사를 새로 추가하고 싶은데 아직 출발 시간이 정해지지 않았다고 하자. 그러면 Time 열(Column)에는 값이 없기 때문에 NULL값이 들어갈 수밖에 없다. 이처럼, 데이터가 불완전하게 삽입되는 경우를 '삽입 이상'이라고 한다.
3) 삭제 이상
삭제를 하면서 그에 대한 모든 정보가 삭제되어 남아 있지 않게 되는 경우이다.
만약 DELTA 항공사의 USA 비행 스케줄이 취소됐다고 가정하자. 이때 USA 값을 삭제하고자 데이터를 삭제하면 DELTA 항공사의 정보마저 삭제된다. 그러면, DELTA 항공이 28B게이트를 이용한다는 정보마저 삭제되므로 데이터 베이스에 이상이 생기게 된다. 이러한 경우를 '삭제 이상'이라고 한다.
- 정규화의 종류
1) 1NF(제1 정규화)
테이블 안의 모든 값들은 단일 값이어야 한다.
Arrival 열(Column)과 같이 여러 개의 값이 한 열(Column) 안에 들어가 있으면 데이터를 가공하기가 어렵다. 이러한 경우 테이블 안에 여러 개의 값을 저장하고 있으므로, 제1 정규성을 어긴다고 볼 수 있다. 제1 정규성을 위반하는 문제를 해결하기 위해서는 아래와 같이 테이블을 분리해서 하나를 만들어 주고, Arrival의 AircraftID를 foreign key로 설정하여 두 테이블 간의 참조 관계를 만들어준다.
2) 2NF(제2 정규화)
제2 정규화는 1NF를 만족하면서, 완전 함수 종속성을 가진 관계들로만 테이블을 만드는 것을 말한다.
- 함수 종속성
x값에 따라서 y값이 결정되는 경우 함수의 종속성이 있다고 한다. 다음과 같은 승객 데이터가 있다고 하면, Name에 따라서 그 사람의 성별(경칭)이 정해지고, Airline & Gate & Arrival에 따라서 출발 시간(Time)이 정해진다. 이때, Honorific은 Name에 함수 종속성이 있다고 하고, Time은 Airline & Gate & Arrival에 함수 종속성이 있다고 한다.
제2 정규화는 이러한 종속성들 중 종속 관계에 있는 열(Column)들끼리 테이블을 구분해 주는 것이다. 위의 데이터는 제1 정규화는 만족하기 때문에 남은 완전 함수 종속성을 가진 테이블들로 구분하여 제2 정규화를 충족시킨다.
3) 3NF(제3 정규화)
제3 정규화는 제2 정규화를 만족하면서, 기본키(Primary Key)에 대해 이행적 함수 종속이 되지 않는 것을 의미한다.
만약 Passenger 데이터에서 Gender가 추가되었다고 하자. 그러면 (Id, Name → Honorific → Gender)로 종속 관계를 가지게 된다. 이때, Gender는 기본키인 Id에 직접적인 종속 관계에 있지 않고 Honorific에 의해 정해지기 때문에 이행적 함수 종속관계에 있다고 한다. 따라서, 제3 정규화를 위반하게 된다.
따라서, 모든 열(Column)들이 기본키에 대해 직접적인 함수 종속성을 가지기 위해 세 개의 테이블로 나누어 정규화해주었다.
세 개의 테이블로 나눈 결과 각각 테이블이 기본키와 직접적인 함수 종속관계를 갖는 데이터로 정규화가 이루어졌다고 볼 수 있다.
- 비정규화
비정규화는 정규형에 일치하게 되어 있는 테이블을 정규형을 지키지 않는 테이블로 만드는 것을 의미한다. 정규형을 지키면 이상 현상(갱신, 삭제, 삽입)을 방지할 수 있고, 테이블의 구조를 수정하고 이해하기 편하다는 장점이 있다. 반면에, 테이블이 조각조각 나뉘어 있기 때문에 속도가 느리고, 성능이 저하될 수 있다는 단점이 있다.
만약 테이블을 가공하는 것이 아니라 조회하는 용도로 사용하거나, 너무 데이터가 많이 나뉘어 있어 성능이 저하된 다면 비정규화를 하여 테이블을 다루는 것이 더 효율적일 수 있다. 따라서, 어떤 작업을 수행하는지, 어떤 데이터를 사용하는지에 따라 적절한 정규화를 하는 것이 좋다.
'Database > MySQL' 카테고리의 다른 글
[Programming][MySQL] Data type(문자형, 숫자형, 날짜 시간형) (0) | 2021.08.22 |
---|---|
[Programming][MySQL] 뷰(View) 테이블 생성하기 (0) | 2021.08.22 |
[Programming][MySQL] 데이터 모델링(ERM/ ERD) (0) | 2021.08.13 |
[Programming][MySQL] 외래키(Foreign Key) (0) | 2021.08.12 |
[Programming][MySQL] 테이블 가공하기(ALTER) (0) | 2021.08.04 |
댓글