출처 - 생활코딩
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 테이블을 따로 만들어 이행적 종속성 제거