공부/DB

정규화

Egomi 2017. 4. 13. 15:45

정규화 시작 전, 조인 관계에 있는 두 테이블 간의 부모, 자식 관계를 우선 설명해보겠다.

부모 ó 자식(부모의 칼럼을 FK로 가짐) 관계 : 참조 관계에서 기존에 존재했던 테이블(부모)의 칼럼에 새로 생성되는 테이블(자식)의 칼럼이 들어가는 것이다.

예시로 설명해보자.

강좌 테이블이 있다. 속성은 아래 그림과 같다.


<강좌 테이블에서 제 1정규화와 제 3정규화(완전x)를 거친 것>

난이도는 상,중,하로 나뉘어져있는데, 모두 같은 의미를 뜻하는 반복되는 데이터가 된다. (제 1정규화 (제 1정규화 위반)

제 1 정규화로 중복제거를 위해 테이블을 나누었다.

 <강좌> 생성 전 <난이도>를 별도 테이블로 생성했기 때문에 이런 경우 <난이도>가 부모가 된다.

이럴 경우, 자식이 부모를 참조하므로 <강좌>테이블의 난이도코드가 <난이도>테이블을 참조하게 된다.(일대다관계)


또 다른 경우를 살펴보자.

강좌 안에는 Java, C, C++등 다양한 언어가 들어갈 수 있다.(3정규화 위반)

이럴 경우에는 하나의 강좌가 여러 개의 강좌언어를 참조하게 된다.

, 참조하는 놈이 <강좌언어>가 되므로 <강좌언>가 자식테이블이 된다.(다대일 관계)


아 헷갈린다.

부모는 최대 하나, 자식은 여럿 올 수 있으니까, 하나의 행(부모테이블)이 여러 개의 행(자식테이블)을 참조하는 경우로 구분하자. 자식이 부모를 참조해 부모의 옆에 붙는다. 기억하자.



정규화

정규화란, DB의 중복을 줄이는 것을 말한다.

정규화에는 총 11가지 방법이 있는데, 흔히 많이 쓰는 방법은 4가지이다.

제 1정규화란, 칼럼에 중복된 내용을 별도의 테이블로 분리하는 것을 말한다.

뭐라고? 

예시로 설명해보자.


< 제 1정규화 설명을 위한 속성>

제 1 정규화는 칼럼에 새롭고 같은 값이 반복될 때, 이를 줄이는 것이다.

<특기>칼럼 같은 경우, 한 사람당 N개가 올 수 있다.(업무자에게 1개인지, N개인지 물어봐야 한다. 여기선 N개)

이럴 경우, 사람의 정보가 반복되고 취미가 다른 반복이 나타날 수 있다.

반복되는 사람의 정보를 줄이고, 취미를 별도의 테이블로 만들어 참조할 수 있도록 한다.

=> 이럴 경우, [특기]테이블이 자식이 되어 [개인정보]를 참조하게 된다.


주의할 점은, 이름도 반복될 수 있지만 이런 경우 동명이인이므로 다른 의미를 갖게 되어 반복이 아니게된다.

제 3정규화는 같은 의미의 값이 반복될 때, 이를 줄이는 것이다.

<제 3정규화 예시>

난이도는 상, 중, 하 로 같은 의미로 여러 칼럼에 중복되게 된다. 

이럴 경우 제 3정규화 위반이다.

(제 1정규화와 비슷할 수 있으나. 제 1은 하나의 속성에 여러가지 값이 들어가고 제 3은 하나의 값이 들어가는 것이다)

별도의 테이블로 위와 같이 빼준 후, 부모 관계에 대해 생각해본다. 

강좌에서 난이도로 빠져나와, 자칫 [강좌]테이블을 부모로 생각할 수 있으나 아니다.

우선 생성된 테이블이 있다면, 부모가 된다.

난이도의 경우, 미리 생성했기 때문에 [난이도]의 테이블이 부모가 되어야한다.

< 제 3정규화를 모두 거친 강좌 테이블 >

모두 같은 의미의 데이터가 중복되는 경우, 다른 테이블로 뺐다.

헷갈리는 것이 두 가지 있었는데, 부모자식 관계와 언어 대신 버전을 테이블로 뺐다는 점이다.

부모 자식 관계는 어느 것이 우선 생성되었고, 어느 것이 하나의 행에 여러개의 행이 매치될 수 있는지 생각해보면 된다.

언어 대신 버전을 테이블로 뺀 것은 동명이인과 같이 의미가 다른 데이터 때문이다.


필자는 처음에

Java 1.0.8

C 1.0.8

Java 1.0.7

C 1.0.5

과 같은 데이터가 있다면, 당연히 언어가 중복된다고 생각했다.

아 헷갈려 ㅁㄴ