정규화
정규화 시작 전, 조인 관계에 있는 두 테이블 간의 부모, 자식 관계를 우선 설명해보겠다.
부모 ó 자식(부모의 칼럼을 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
과 같은 데이터가 있다면, 당연히 언어가 중복된다고 생각했다.
아 헷갈려 ㅁㄴ