본문 바로가기

Oracle/DB Modeling

DB Modeling

DB Modeling Example

제 1 ~ 제 3 정규화의 개념을 예와 함께 정리해본다.

제 1 정규화 : 원자성, 모든 속성을 반드시 한개의 값(Atomic Value)을 가져야 한다.
아래의 경우 친구이름 컬럼의 값이 원자성을 갖지 못하고 동일 속성의 값이 반복되고 있다.
그러므로 [친구이름] 컬럼을 분리하여 별도의 테이블을 만들고 부모 테이블의 기본키를 외부키로 하여 1:다의 관계를 설정한다.
DB모델링의 가장 기본적인 형태이다.

학생 테이블
 학생번호 (PK)  학생이름  친구이름
 1  김인철  최재철 김창운
 2  이성호  박진우 정동영 김한나


위의 테이블은 다음과 같이 2개의 테이블로 구성하여 1:다의 관계를 갖도록 한다.

학생 테이블                                                                  친구 테이블
 
 학생번호(PK)  학생이름
 1  김인철
 2  이성호

 
 학생번호(FK)  친구이름
 1  최재철
 1  김창운
 2  박진우
 2  정동영


# 함수적 종속성: 엔티티 내부의 속성간의 종속성
제 2 정규화 : 완전 함수적 종속성, 복합키 전체에 종속되지 않는 컬럼들을 분리한다(부분 종속성 제거).
다음 테이블에서 학생번호, 팀명은 복합키로 지정되어 있는데, 프로젝트명은 팀명에 따라 달라질 수 있으므로 팀명은 프로젝트명을 결정할 수 있는 속성이고, 이런 경우 프로젝트명은 팀명에 종속적이라고 한다. 프로젝트명은 복합키의 전체에 종속적이지 않고 복합키의 일부분인 팀명에 종속적이기 때문에 팀명과 프로젝트명을 분리하여 별도의 테이블로 구성해야 한다.

학생 테이블
 학생번호(PK)  학생이름  팀명(PK)  프로젝트 명  점수
 1  홍길동 팀 A  안드로이드 A  92
 2  이성호 팀 B   안드로이드 B  98



위의 테이블이 제 2 정규화를 거치면 다음과 같은 형태로 분리될 것이다.

학생 테이블                                                          프로젝트 테이블
 
학생번호(PK) 학생이름  팀번호(FK)  점수
 1  홍길동  1  92
 2  이성호  2  98
 
 팀번호(PK) 팀명  프로젝트명
 1  팀 A  안드로이드 A
 2  팀 B  안드로이드 B


# 이행적 함수종속성: 키가 아닌 속성에 종속되는 것
제 3 정규화 : 이행적 함수종속성 제거, 기본키에 종속적이지 않고 다른 일반컬럼에 종속적인 컬럼들을 분리한다.
아래의 컬럼 구성에서 팀 담당교수는 학생번호에 종속적이지 않고 팀번호에 종속적이다.

학생 테이블
 학생번호(PK)  학생이름  팀번호  팀 담당교수
 1  박지성  1  홍록기
 2  김연아  2  추성훈



위의 테이블이 제 3 정규화를 거치면 다음과 같은 상태가 될 것이다.

학생 테이블                                                       팀교수 테이블
 
 학생번호(PK)  학생이름  팀번호(FK)
 1  박지성  1
 2  김연아  2
 
 팀번호(PK)  담당교수
 1  홍록기
 2  추성훈



제 4 정규화 : 다대다 관계의 해소, 제 2 정규화를 거친 테이블은 다대다 관계가 있어서는 안된다.
예를 들어, 제 2 정규화를 통해서 학생테이블, 수강과목 테이블이 분리되었다고 할 때, 한 학생은 여러 과목을 수강할 수 있고, 한 과목은 다수의 학생들이 수강신청할 수 있으므로 이들 2개의 테이블 사이에는 다대다 관계가 있음을 알 수 있다.  다대다 관계는 현실에서는 존재하지만 DB 모델링에서는 표현할 수 없는 관계이기 때문에 이들 테이블 중간에 관계 테이블(Association Table)을 추가해서 1대다 -  다대1 관계로 변환한다.


학생 테이블                                   수강등록 테이블                                                  수강과목 테이블
 
 학생번호(PK)  학생이름
 1  스미스
 2  루이스
 
 학생번호(PK)  과목번호(PK)  등록일자
 1  1  2010/10/15
 1  2  2010/10/15
 2  1  2010/10/11
 2  2  2010/10/11
 
 과목번호(PK)  과목이름
 1  Programming
 2  Database


중간에 추가된 관계 테이블에는 양쪽 테이블의 PK를 가져와서 복합키로 구성하는 것이 일반적인 방법이며, 이 때 복합키 전체에 일반 컬럼들이 완전종속되어야 한다. 그렇지 않으면 제 2 정규화를 위반하게 된다.