출처 - 생활코딩
https://www.youtube.com/watch?v=moAXl6fvDO0&list=PLuHgQVnccGMDF6rHsY9qMuJMd295Yk4sa&index=5
생활코딩 이고잉님의 강의를 토대로 정리했습니다.
정규화
정제되지 않은 데이터를 관계형 데이터베이스에 어울리는 표로 만들어주는 레시피이다.
정제되지 않은 데이터
- 현재
tag
칼럼의 데이터가 2개 이상이다.
- 제 1 정규화를 통해
Atomic
하게 만드는 것이 목표!
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 정규화
- 제 1 정규화는 테이블 내의 모든 칼럼이 원자적(Atomic)값만을 가지도록 하는 과정이다.
- 즉, 테이블의 칼럼이 하나의 값을 가지고, 그 값을 구성하는 다른 속성들로 분해되지 않도록 하는 것이다.
- 핵심은
Atomic Columns
이다.
- 따라서 제 1 정규화는 데이터베이스의 중복을 제거하고 데이터 일관성을 유지하기 위한 필수적인 과정이다.
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 |
topic_tag_relation | |
---|
topic_title | tag_id |
MySQL | 1 |
MySQL | 2 |
ORACLE | 1 |
ORACLE | 3 |
tag | |
---|
id | name |
1 | rdb |
2 | free |
3 | commercial |
tag
칼럼을 독립된 테이블로 분리했다.
topic
과 tag
는 다대다 매핑이므로 두 테이블은 연결하는 연결 테이블이 필요함.
topic
의 PK인 title
과 tag
의 PK인 id
를 FK로 가지는 연결 테이블 topic_tag_relation
생성
- 제 1 정규화 완료
제 2 정규화
- 제 2 정규화의 핵심은 부분 종속성을 제거하는 것!
- 부분 종속성이란 테이블의 후보키 중 일부 속성만으로 다른 속성들의 값을 결정할 수 있는 경우이다.
기존 topic 테이블
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 |
제 2 정규화 완료
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 |
description
, created
, author_id
, author_name
, author_profile
은 title
에 종속됨.
- 즉,
title
값에 따라 값들이 자동으로 결정됨.
- 종속되지 않은
type
과 price
로 topic_type
이라는 테이블을 만들어 중복을 제거했다.
제 3 정규화
- 제 3 정규화의 핵심은 이행적 종속성(Transitive Dependency)을 제거하는 것이다.
- 테이블이 더 작은 단위로 분해되면서 각 테이블은 자신만의 후보키를 가지게 된다.
기존 topic 테이블
topic | | | | | |
---|
title | description | created | author_id | author_name | author_profile |
MySQL | MySQL is ... | 2011 | 1 | kim | developer |
ORACLE | ORACLE is ... | 2012 | 1 | kim | developer |
author_name
과 author_profile
은 author_id
에 종속하고 author_id
는 title
에 종속한다.
제 3 정규화 완료
author | | |
---|
id | author_name | author_profile |
1 | kim | developer |
topic | | | |
---|
title | description | created | author_id |
MySQL | MySQL is ... | 2011 | 1 |
ORACLE | ORACLE is ... | 2012 | 1 |
author
테이블을 따로 만들어 이행적 종속성 제거