Programming/Database

데이터 모델링 :: 3. 제 1 정규화 (중복 데이터 해소)

WANJIN 2017. 4. 17. 23:42
반응형

3. 제 1 정규화

중복 데이터 또는 중복 컬럼(속성)을 별도의 테이블(엔티티)로 만들고, 기존 테이블과 관계를 맺어준다.

여기부터 이제 평화로웠던 디비나라에 격변이 일어나기 시작함...


말로만 보면 당최 뭔 말인지 모르겠으니 직접 한번 해보겠다.




먼저 앞의 엔티티, 속성, PK까지 정하는 과정을 거쳐서.. 아래처럼 테이블들이 나왔다. 

뭐 이건 어떤 시스템이냐에 따라(고객이 무엇을 원하냐에 따라) 달라질 수 있는 것들이다. 즉 노답임.



'강의' 테이블을 기준으로 순서대로 해보면.

1. 테이블에서 중복되는 데이터를 뽑아 별도의 테이블로 분리한다.    

이 테이블에서 '중복되는 데이터'를 뽑아내야 하는데 얼핏 보면 모르겠지만 다양한 데이터가 여러개 쌓이는 경우를 생각해보면 그렇지가 않다.

A라는 강의가 있을 때, 그 강의가 4월에 시작하고 5월에 끝나고, 또다시 6월에 개강할 수 있다.

그러면 아래처럼 테이블이 만들어질 것임.

 강의번호

강의명 

내용 

시작일 

종료일 

 LEC01

 A

데이터 모델링 

2017-04-20 

2017-05-20 

  LEC02

 A

데이터 모델링 

2017-06-01

2017-07-01 


전혀 문제가 없는 것 처럼 보이지만... 이렇게 되면 데이터의 중복이 발생한다. 

A강의는 강의명과 강의내용은 동일하지만, 시작일이 다르므로 서로 다른 '강의'로 취급된다는 점이다.

따라서 각각 다른 강의번호를 가지게된다.

이는 이후에 데이터를 관리할 때 번거로움과 어려움이 따를 수 있다.


 따라서 이런 경우에는 중복되는 데이터가 있는 것들만 따로 빼내서 별도의 테이블로 정의해야 한다.


2. 새로 만든 테이블에서도 PK(주키)를 선정한다.



위에서 강의명과 내용을 따로 뽑아서 '교육과정'이라는 테이블을 만들었다.

그러면 해당 테이블에서도 각각을 대표할 수 있는 식별자가 있어야 하는데, 강의명과 내용은 식별자(주키)로 사용하기에 적절하지 않으므로, 교육과정번호라는 임의의 컬럼을 만들어 주키로 선정했다.

(주키를 선정하는 방법은 이전 포스트에 있다능)


3. 새로만든 테이블과 기존 테이블간에 부모-자식 관계를 맺어준다.

기존의 강의 테이블과 새로 만든 교육과정 테이블은 서로 '관계'가 있다. 
교육과정 테이블은 중복된 데이터를 뽑아냄으로써 만들어진 테이블이라는 것만으로도 서로 관계가 있다는 것을 알 수 있다.

이럴 때, 두 테이블 간에 관계를 맺어주어야 하는데 아래와 같이 맺어주면 된다.


이렇게 엔티티(테이블)들을 선으로 연결시켜주면 된다.

고런데, '강의'테이블에 아까는 없었던 '교육과정번호'라는 컬럼이 생겼다.
이건 '교육과정' 테이블과 관계가 맺어지면서 만들어진 외래키(Foreign Key, FK, 참조키)라는 것이다.
외래키 이놈은 반드시 참조하고있는(관계를맺고있는) 교육과정 테이블에서 식별자 역할을 하는 unique한 컬럼만 될 수 있다.
보통  PK를 외래키로 참조한다.

근데 관계를 맺은것 까진 알겠는데...
교육과정 테이블에 '강의번호'라는 외래키가 들어갈 수도 있을텐데.
왜 꼭 강의 테이블에 '교육과정번호'라는 외래키가 생겼나 하는 의문이 들 것이다.
그건 누가 부모테이블이고 누가 자식테이블인지에 따라 달라진다.

강의 테이블에서 교육과정 테이블이 떨어져 나왔으니까 마치 교육과정이 자식테이블 같겠지만..
안타깝게도 그 반대다.

 교육과정

강의 

 교육과정번호

강의명 

내용 

 강의번호

시작일 

종료일 

 C01

 A

데이터 모델링 

 LEC01

2017-04-20 

2017-05-20 

 C01

 A

데이터 모델링 

 LEC02

2017-06-01

2017-07-01 


다시 이 표를 살펴보면, 
같은 교육과정 C01에 대하여 여러 강의가 개설될 수 있다.
하나의 자식이 여러 부모는 둘 수 없지만, 하나의 부모는 여러 자식을 가질 수 있다는 상식으로 접근하면 이해가 빠를 것임.


이렇게 관계까지 다 맺어주고 나면 관계 차수라는 것을 정해주어야 하는데, 이건 제3 정규화까지 진행한 후에 하는걸로 하게따.

끄읏-.

 



반응형