본문 바로가기
DATABASE/MySQL

[MySQL] 관계형 데이터 모델링 2 (논리적 모델링) - 정규화

by sjs_2215 2019. 8. 29.

수련: https://github.com/egoingsb/offline/wiki/database---mysql

강의: https://opentutorials.org/module/4134/25301

정규화 연습장: https://docs.google.com/spreadsheets/d/1zmN7qQYjKGkQW0aSKFQxEJ-yLVXYM27AHgnsybJGvFM/edit?usp=sharing

 

정규화 v2 - http://bit.ly/2wV2SFj

Unnormalized form Unnormalized form topic title,type,description,created,author_id,author_name,author_profile,price,tag MySQL,paper,MySQL is ...,2011,1,kim,developer,10000,rdb, free MySQL,online,MySQL is ...,2011,1,kim,developer,0,rdb, free ORACLE,paper,OR

docs.google.com


 

[MySQL] 관계형 데이터 모델링 2 (논리적 모델링) - 정규화

 

Normalization 정규화

= 정제되지 않은 데이터를(표를) 관계형 데이터베이스에 맞게 만들어 주는 레시피

= 이상현상이 발생하는 릴레이션을 분해하여 이상현상을 없애는 과정

정규형이 높을수록 이상현상은 줄어듦


 

제 1 정규형

= 칼람에 값이 딱 1개만 존재하는 경우

= 속성 값이 원자값을 갖도록 분해

릴레이션R의모든속성값이원자값을가지면제1 정규형이라고함.

 

제 1 정규형으로 변환 ex)
고객취미들(이름, 취미들) 릴레이션을 고객취미(이름, 취미) 릴레이션으로 바꾸어 저장하면 제1정규형을 만족한다.

 

제 1 정규형을 만족시키게 만들어보자!

  • Unnormalized from

tag 컬럼의 값이 atomic 하지 않음 -> 제 1 정규화를 해보자

topic                
title type description created author_id author_name author_profile price tag
MySQL paper MySQL is ... 2011 1 kim developer 10000 rdb, free
MySQL online MySQL is ... 2011 1 kim developer 0 rdb, free
ORACLE online ORACLE is ... 2012 1 kim developer 0 rdb, commercial

 

1. 먼저 topic과 tag의 관계를 살펴보자

하나의 topic이 여러 개의tag를 가질 수 있음

tag는 여러 개의 topic을 가질 수 있음

 

 

 

 

-> cardinality가 N : M 이다 -> 단순히 테이블을 쪼개는 것으로 안되고 맵핑 테이블을 추가적으로 만들어줘야 함.

tag는 type이나 다른 것에 상관 없이 title에만 의존적임을 알 수 있음 -> 그러므로 맵핑 테이블에는 title과 tag의 id를 아래와 같이 포함시켜주면 됨

 

topic_tag_relation  
topic_title tag_id
MySQL 1
MySQL 2
ORACLE 1
ORACLE 3

 

(맵핑 테이블 외) 쪼개진 테이블은 아래와 같음

 

topic              
title type description created author_id author_name author_profile price
MySQL paper MySQL is ... 2011 1 kim developer 10000
MySQL online MySQL is ... 2011 1 kim developer 0
ORACLE online ORACLE is ... 2012 1 kim developer 0
tag  
id name
1 rdb
2 free
3 commercial

 

제 2 정규형

= 완전 함수 종속성만 있는 경우를 말함

= 부분 종속성이 없어야 함

= 표의 key 중 중복키가 없어야 함

 


 

제 2 정규형을 만족시키게 만들어보자!

위 제 1 정규형이 완료된 표를 보면, 중복이 발생되는 부분이 있음을 알 수 있음

(중복되는 부분)

 

description created author_id author_name author_profile
MySQL is ... 2011 1 kim developer
MySQL is ... 2011 1 kim developer

-> 이 중복되는 부분은 title에 종속되어 있음. (Type 칼람과는 달리)

-> topic이라는 표는 title과 price를 위한 표임 부분 종속되는 부분과는 달리.

-> 부분 종속되는 부분과 전체적으로 종속되는 부분을 분리하면 됨

 

topic          
title description created author_id author_name author_profile
MySQL MySQL is ... 2011 1 kim developer
ORACLE ORACLE is ... 2012 1 kim developer
topic_type    
title type price
MySQL paper 10000
MySQL online 0
ORACLE online 0

다른 부분은 동일!

 

다른 예)

 

 


 

제 3 정규형

=이행적 종속이 없을 때 성립함 no transitive dependencies

이행적 종속

a->b, b->c가 성립할 때 a->c가 성립되는 함수 종속성을 뜻함

 


 

제 3 정규형을 만족시키게 만들어보자!

 

title->author_id, author_id->author_name&author_profile이 성립되고 a->c가 됨.

topic          
title description created author_id author_name author_profile
MySQL MySQL is ... 2011 1 kim developer
ORACLE ORACLE is ... 2012 1 kim developer

 

해결책) 중복이 되는 부분(1, kim, develper)을 따로 뺀다.

author    
id author_name author_profile
1 kim developer

 

그리고 원래 테이블의 author_id를 foreign key로 만들어주면 됨. 즉, 분리한 테이블을 pk와 fk로 연결시키면 됨.

topic      
title description created author_id
MySQL MySQL is ... 2011 1
ORACLE ORACLE is ... 2012 1

 

나머지는 동일

Comments