## 생활코딩 강의를 정리하며 관계형 데이터 모델링에 대해 공부합니다.
정규화란?
정규화(Normalization) - 정제되지 않은 데이터를 관계형 데이터 모델링에 어울리는 표로 만들어주는 레시피
관계형 데이터 모델링의 기초가 되는 것으로 애드거 프랭크 커드가 제안한 방법.
UNF(un normal form) - 정규화 되어있지 않은 형태의 표
1NF(first normal form) - 1정규형. 각각의 컬럼이 atomic하다면 1정규형을 만족시킨다.
각각의 항목을 만족시킬 때마다 한단계씩 올라가며, 6NF 가 되면 가장 이상적인 표가 된다는 것을 보여준다.
산업적으로는 제 3정규형까지 사용되고 그 뒤는 학술적으로 사용되는 범위이다.
UNF
위는 topic 에 대한 표로 title과 type을 묶어서 중복키로 PK로 지정해놓았다.
그런데 cyan 색으로 지정된 tag 컬럼을 보면 값이 두개씩 들어가 있어서 관계형 데이터베이스에 적절하지 않은 모습이 보인다.
붉은색으로 표시된 부분도 중복된 데이터로 관계형 데이터베이스에 적절하지 않은 형태로 보인다.
이를 차례로 정규화 하면서 관계형 데이터베이스에 적합한 형태로 바꾸어 본다.
1NF (First Normal Form)
Atomic coulumns - 각 컬럼의 값들 하나하나가 atomic 해야 한다는 의미인데 이게 정확히 어떤 뜻일까.
"각각의 컬럼의 값들이 값을 하나만 가져야 한다"는 뜻.
아래 표에서 tag는 값을 두개씩 가지고 있으므로 Atomic 하지 않다.
값이 Atomic 하지 않다면,
SELECT * FROM topic WHERE tag ='free' 나, SELECT * FROM topic ORDER BY tag
와 같은 명령을 수행할 수 없고, JOIN 도 불가능하다.
컬럼을 Atomic 하게 하기 위해 몇가지 방법을 시도해본다.
첫번째. tag를 행을 추가해서 분리해 표를 작성한다.
제1정규형을 만족하기는 하지만 이와 같은 방식은 수많은 데이터의 중복을 발생시키므로 적절하지 않다.
두번째. tag를 컬럼을 추가해서 분리한다.
마찬가지로 제1정규형을 만족시키지만, tag가 늘어날 때마다 컬럼 구조 자체를 바꾸어야 하는 문제점이 발생하고, tag가 하나일 때는 다른 컬럼에 null 값이 필요하므로 데이터의 낭비가 발생한다.
좋은 방법은 표를 쪼개는 것이다.
topic 과 tag의 테이블로 쪼개본다.
topic과 tag는 N:M의 관계이므로 Mapping table 도 필요하다.
tag에 id값을 달아서 Mapping table을 작성해보면 아래와 같다.
topic 테이블을 title 과 type을 중복키로 가지고 있지만, 현재 표에서 tag는 type 과는 상관없이 title에 따라 구분되도록 되어 있으므로, title만 FK로 가져온다.
2NF(Second Normal Form)
No partial dependencies - 부분종속성을 없애야 한다.
표의 기본키 중에 중복키인것이 없다면 해당사항이 없으나, 중복키가 하나라도 있다면 2정규화가 필요하다.
아래 색칠된 부분은 부분종속성 때문에 중복이 발생하게 된다.
색칠된 부분은 title 에만 부분적으로 종속되어 있기 때문에 중복이 발생하는 것이다.
title에 부분적으로 종속되는 컬럼과, 중복키 전체에 종속되는 컬럼을 분리해줌으로서 해결한다.
topic 테이블에는 title에 부분적으로 종속되는 부분만을 가져오고, 중복되는 행이 존재하지 않도록 처리한다.
title, type에 모두 종속적인 컬럼은 topic_type이라는 테이블로 분리한다.
이렇게 처리함으로써 2정규화가 처리되었다.
3NF(Third Normal Form)
No transitive dependencies - 이행적 종속성.
말이 어려우므로 결론을 먼저 살펴보면,
topic 테이블에서 author 라는 테이블이 분리해 나가고, author_id를 통해서 author에 의존하게 된다.
제2정규화를 마친 표에서 topic의 행은 title이라는 기본키에 종속되어있다.
author_id도 title에 종속되어 있기는 하다.
그런데 잘 살펴보면 author_name 과 author_profile은 author_id에 종속되어있는 것을 알 수 있는데,
이를 "이행적 종속성" 이라고 한다.
이행적 종속성을 가지고 있다면, 중복이 존재하게 된다.
DB에서 중복은 언제나 문제를 갖고 있으므로,
중복을 만들어내는 부분을 분리해내고, 분리된 테이블의 키값을 FK로 쥐어준다.
author_id가 기존 표에 없었을 가능성이 높은데, 중복된 데이터를 잘 살펴보면 어떤 것들이 이행적 종속성을 가지는지 발견할 수 있다.