데이터 모델링 :: 3. 제 1 정규화 (중복 데이터 해소)
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. 새로만든 테이블과 기존 테이블간에 부모-자식 관계를 맺어준다.
교육과정 | 강의 | ||||
교육과정번호 | 강의명 | 내용 | 강의번호 | 시작일 | 종료일 |
C01 | A | 데이터 모델링 | LEC01 | 2017-04-20 | 2017-05-20 |
C01 | A | 데이터 모델링 | LEC02 | 2017-06-01 | 2017-07-01 |