미래학자
[MySQL] 5장 정규화 (1NF, 2NF, 3NF) 본문
이전까지 MySQL의 기본적인 사용방법을 다뤘습니다.
이번 시간에는 정규화에 대해 간단히 공부할 생각입니다.
정규화에 대한 이해가 없으시면, 정규화가 조금 난해하게 다가올 수 있습니다.
그 동안 정규화는 1NF, 2NF, 3NF, BCNF.... 가 있으며, 1NF는 원자적 데이터를 만족해야 하고, 2NF는 부분적 함수종속이 없어야 하며,,단계가 높아질 수록
엄격해고,,, 이런 사전적인 정의만으로 공부하셨다면 제 글이 도움이 될 것입니다.
저는 이번 시간에 딱 1NF, 2NF, 3NF 만 다루겠습니다. 이 글은 4장에서 배운 합성키와, 함수적 종속의 이해가 필요합니다.
정규화는 왜 할까요? 아래는 위키백과에 있는 정규화의 목적입니다.
-> 저는 이런 내용들이 머리에 하나도 들어오지 않습니다. 또, 이것을 학습할 수도 없습니다.
헤드퍼스트 책에는 간단히 설명합니다.
다른 사람이 보더라도 데이터 베이스의 전체 구조 및 테이블의 관계를 쉽게 파악할 수 있도록 하기 위함.
사람마다 목적에 따라 다르게 테이블을 조직화 할 수 있고, 또 제대로 된 기능만 한다면 그것은 문제가 되지 않을 수 있습니다. 그러나 만약 모든 사람들이
자신만의 스타일로 테이블의 구조를 만든다면?? 코딩스타일과 마찬가지로 정규화란 테이블 설계에 대한 좋은 패턴이라고 말할 수 있습니다.
정규화가 잘 된 테이블은 한 눈에 그 구조를 파악하기 쉬우며, 또 이용하기도 좋습니다.
※ 책에서 내용을 그대로 옮긴 것 입니다. 저도 가장 중요한 이슈로 데이터의 무결성 보장이라고 생각 합니다.
- 1NF
- 2NF
- 3NF
1NF
1NF에는 기본 규칙이 하나 있습니다. 바로 기본키(PRIMARY KEY)를 가져야 한다는 것이죠. 관련 내용을 잘 아실 것이라 생각합니다.
규칙 1 : 원자적 데이터로 구성된 열은 그 열에 같은 타입의 데이터를 여러개 가질 수 없다.
규칙 2 : 원자적 데이터로 구성된 테이블은 같은 타입의 데이터를 여러개 가질 수 없다.
예를 통해서 알아보겠습니다.
my_toy1
toy_id | toy | colors |
2 | kite | red, pink, blue |
5 | yoyo | red, blue |
7 | doll | pink, blue |
my_toy2
toy_id | toy | color1 | color2 | color3 |
2 | kite | red | pink | blue |
5 | yoyo | red | blue |
|
7 | doll | pink | blue |
|
위 표 중 my_toy1은 규칙 1을 만족하지 않고, my_toy2는 규칙 2를 만족하지 않습니다.
color
color_id | name | rgb6 |
1 | red | FF0000 |
2 | pink | AA4655 |
3 | blue | 000FF |
이런식으로 색깔에 대한 테이블을 새로 만들고
toy_color
_idx | toy_id | color_id |
1 | 2 | 1 |
2 | 5 | 1 |
3 | 7 | 2 |
4 | 2 | 2 |
5 | 2 | 3 |
6 | 7 | 3 |
7 | 5 | 3 |
my_toy(1NF)
toy_id | toy |
2 | kite |
5 | yoyo |
7 | doll |
2NF
제2 정규화는 부분적 함수 종속이 없애는 것 입니다. 부분적 함수 종속은 4장에서 학습하였습니다. 테이블에서 사용하는 기본키가 복합키가 아니라면,
2NF를 만족하게 됩니다.
4장에서 학습한 부분적 함수 종속 부분은 다음과 같습니다.
아래의 스마트폰 테이블은 핸드폰과 제조사가 합성키다.
스마트폰
모델 | 제조사 | 운영체제 |
아이폰 7 | APPLE | iOS |
갤럭시 S7 | SAMSUNG | 안드로이드 |
루미아 | 노키아 | 윈도우 모바일 |
이 때 함수 종속 관계를 보면
핸드폰 -> 운영체제
제조사 -(X)> 운영체제
운영체제는 합성키의 부분인 핸드폰에 대해서는 종속이다.
운영체제는 합성키의 부분인 제조사에 대해서는 종속이 아니다.
이 때 합성키의 부분적으로 함수적 종속인 관계를 부분적 함수 종속이라 한다.
여기서 부분적 함수 종속을 없애는 것은 가장 간단한 방법으로 합성키를 사용하지 않는 것입니다.
id |
모델 |
제조사 |
운영체제 |
1 |
아이폰 7 |
APPLE |
iOS |
2 |
갤럭시 S7 |
SAMSUNG |
안드로이드 |
3 |
루미아 |
노키아 |
윈도우 모바일 |
이렇게 유일성을 만족하는 키를 새롭게 추가 하는 것입니다.
* 이렇게 실제 값과 관계 없이 새롭게 추가한 키를 synthetic key라 하고 주민번호와 같이 실제로 존재하는 의미 있는 값은 natural key라 한다.
3NF
제3 정규화는 이행적 함수 종속이 없애는 것 입니다. 이행적 함수 종속은 4장에서 학습하였습니다.
4장에서 학습한 이행적 함수 종속 부분은 다음과 같습니다.
주민번호 | 이름 | 주소 | 연락처 | 직장 | 직장 주소 | 직장 전화번호 |
주민번호 -> 이름
-> 주소
-> 연락처
-> 직장
직장 -> 직장 주소
-> 직장 전화번호
위 처럼 관계를 나타낼 수 있다.
이름, 주소, 연락처, 직장은 주민번호에 함수적으로 종속된다.
직장 주소, 직장 전화번호는 직장에 함수적으로 종속된다.
이행적 함수 종속
주민번호 -> 직장 -> 직장 전화번호
이때 전화번호는 주민번호에 대해 이행적 함수 종속 관계이다.
주민번호 |
이름 |
주소 |
연락처 |
직장코드 |
직장
직장코드 |
직장 주소 |
직장 연락처 |
회사원.직장코드 -(참조)-> 직장.직장코드
위와 같이 테이블을 분리하면 3NF를 만족할 수 있다.
parent key, parent table
'DataBase' 카테고리의 다른 글
[MySQL] 7장 조인 : JOIN (INNER, LEFT, RIGHT) (34) | 2016.11.22 |
---|---|
[MySQL] 6장 외래 키 설정하기, 1NF (테이블 쪼개기), (1) | 2016.11.21 |
[MySQL] 4장 키(Primary Key, Foreign Key)의 종류와 함수적 종속 (7) | 2016.11.19 |
[mySQL] 3장 내부 함수, 그룹 묶기 (SUM, COUNT, SUBSTRING, GROUP BY) (2) | 2016.11.18 |
[MySQL] 2장 데이터 변경, 삭제 (ALTER, SELECT, DROP, DELETE) (0) | 2016.11.17 |