Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

미래학자

[MySQL] 5장 정규화 (1NF, 2NF, 3NF) 본문

DataBase

[MySQL] 5장 정규화 (1NF, 2NF, 3NF)

미래학자 2016. 11. 19. 14:34

이전까지 MySQL의 기본적인 사용방법을 다뤘습니다. 


이번 시간에는 정규화에 대해 간단히 공부할 생각입니다. 

 정규화에 대한 이해가 없으시면, 정규화가 조금 난해하게 다가올 수 있습니다.

그 동안 정규화는 1NF, 2NF, 3NF, BCNF.... 가 있으며, 1NF는 원자적 데이터를 만족해야 하고, 2NF는 부분적 함수종속이 없어야 하며,,단계가 높아질 수록

엄격해고,,, 이런 사전적인 정의만으로 공부하셨다면 제 글이 도움이 될 것입니다.


저는 이번 시간에 딱 1NF, 2NF, 3NF 만 다루겠습니다. 이 글은 4장에서 배운 합성키와, 함수적 종속의 이해가 필요합니다.



정규화는 왜 할까요? 아래는 위키백과에 있는 정규화의 목적입니다.


1. 고려되지 않은 삽입, 갱신, 삭제 의존에서부터 관계의 집합을 배제한다;
2. 새로운 자료형이 나타날 때, 관계들의 집합의 재구성의 필요성을 낮추고, 그로 인하여 응용 프로그램의 생명주기를 연장한다;
3. 사용자에게 관계 모델을 더욱 의미있게 한다;
4. 관계들의 집합을 질의의 통계로부터 중립적이게 한다. 질의들은 시간이 지남에 따라 변경되기 때문이다;


-> 저는 이런 내용들이 머리에 하나도 들어오지 않습니다. 또, 이것을 학습할 수도 없습니다.


헤드퍼스트 책에는 간단히 설명합니다.


다른 사람이 보더라도 데이터 베이스의 전체 구조 및 테이블의 관계를 쉽게 파악할 수 있도록 하기 위함.


사람마다 목적에 따라 다르게 테이블을 조직화 할 수 있고, 또 제대로 된 기능만 한다면 그것은 문제가 되지 않을 수 있습니다. 그러나 만약 모든 사람들이

자신만의 스타일로 테이블의 구조를 만든다면?? 코딩스타일과 마찬가지로 정규화란 테이블 설계에 대한 좋은 패턴이라고 말할 수 있습니다. 

정규화가 잘 된 테이블은 한 눈에 그 구조를 파악하기 쉬우며, 또 이용하기도 좋습니다.


※ 책에서 내용을 그대로 옮긴 것 입니다. 저도 가장 중요한 이슈로 데이터의 무결성 보장이라고 생각 합니다.


  1. 1NF
  2. 2NF
  3. 3NF




1NF


 1NF에는 기본 규칙이 하나 있습니다. 바로 기본키(PRIMARY KEY)를 가져야 한다는 것이죠. 관련 내용을 잘 아실 것이라 생각합니다.


규칙 1 : 원자적 데이터로 구성된 열은 그 열에 같은 타입의 데이터를 여러개 가질 수 없다.

규칙 2 : 원자적 데이터로 구성된 테이블은 같은 타입의 데이터를 여러개 가질 수 없다.



예를 통해서 알아보겠습니다.


my_toy1

toy_id 

toy 

colors 

kite 

red, pink, blue 

yoyo 

red, blue 

doll 

pink, blue 


my_toy2

 toy_id

toy 

color1 

color2 

color3 

kite 

red 

pink 

blue 

yoyo 

red 

blue 

 

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 

kite 

yoyo 

doll 




2NF


제2 정규화는 부분적 함수 종속이 없애는 것 입니다. 부분적 함수 종속은 4장에서 학습하였습니다. 테이블에서 사용하는 기본키가 복합키가 아니라면,

2NF를 만족하게 됩니다.


4장에서 학습한 부분적 함수 종속 부분은 다음과 같습니다.



아래의 스마트폰 테이블은 핸드폰과 제조사가 합성키다.


스마트폰

모델

제조사 

운영체제 

 아이폰 7

APPLE

iOS 

갤럭시 S7 

SAMSUNG 

안드로이드 

 루미아

노키아 

윈도우 모바일 


이 때 함수 종속 관계를 보면


핸드폰 -> 운영체제

제조사 -(X)> 운영체제


운영체제는 합성키의 부분인 핸드폰에 대해서는 종속이다.

운영체제는 합성키의 부분인 제조사에 대해서는 종속이 아니다.


이 때 합성키의 부분적으로 함수적 종속인 관계를 부분적 함수 종속이라 한다.


여기서 부분적 함수 종속을 없애는 것은 가장 간단한 방법으로 합성키를 사용하지 않는 것입니다.


id 

 모델

제조사 

운영체제 

아이폰 7 

APPLE 

iOS 

갤럭시 S7 

SAMSUNG 

안드로이드 

루미아 

노키아 

윈도우 모바일 


이렇게 유일성을 만족하는 키를 새롭게 추가 하는 것입니다.


* 이렇게 실제 값과 관계 없이 새롭게 추가한 키를 synthetic key라 하고 주민번호와 같이 실제로 존재하는 의미 있는 값은 natural key라 한다.



3NF


제3 정규화는 이행적 함수 종속이 없애는 것 입니다. 이행적 함수 종속은 4장에서 학습하였습니다.


4장에서 학습한 이행적 함수 종속 부분은 다음과 같습니다.




회사원

주민번호 

이름 

주소 

연락처 

직장

직장 주소 

직장 전화번호 


주민번호 -> 이름

              -> 주소

              -> 연락처

              -> 직장


직장 -> 직장 주소

        -> 직장 전화번호


위 처럼 관계를 나타낼 수 있다. 


이름, 주소, 연락처, 직장은 주민번호에 함수적으로 종속된다.

직장 주소, 직장 전화번호는 직장에 함수적으로 종속된다.


이행적 함수 종속


주민번호 -> 직장 -> 직장 전화번호


이때 전화번호는 주민번호에 대해 이행적 함수 종속 관계이다.


회사원

주민번호 

이름 

주소 

연락처 

직장코드  


직장

 직장코드

직장 주소 

직장 연락처 


회사원.직장코드 -(참조)-> 직장.직장코드

위와 같이 테이블을 분리하면 3NF를 만족할 수 있다.



parent key, parent table




Comments