DB Modeling Example
제 1 ~ 제 3 정규화의 개념을 예와 함께 정리해본다.
위의 테이블은 다음과 같이 2개의 테이블로 구성하여 1:다의 관계를 갖도록 한다.
# 함수적 종속성: 엔티티 내부의 속성간의 종속성
위의 테이블이 제 2 정규화를 거치면 다음과 같은 형태로 분리될 것이다.
# 이행적 함수종속성: 키가 아닌 속성에 종속되는 것
중간에 추가된 관계 테이블에는 양쪽 테이블의 PK를 가져와서 복합키로 구성하는 것이 일반적인 방법이며, 이 때 복합키 전체에 일반 컬럼들이 완전종속되어야 한다. 그렇지 않으면 제 2 정규화를 위반하게 된다.
제 1 ~ 제 3 정규화의 개념을 예와 함께 정리해본다.
제 1 정규화 : 원자성, 모든 속성을 반드시 한개의 값(Atomic Value)을 가져야 한다.
아래의 경우 친구이름 컬럼의 값이 원자성을 갖지 못하고 동일 속성의 값이 반복되고 있다.
그러므로 [친구이름] 컬럼을 분리하여 별도의 테이블을 만들고 부모 테이블의 기본키를 외부키로 하여 1:다의 관계를 설정한다.
DB모델링의 가장 기본적인 형태이다.
학생 테이블
아래의 경우 친구이름 컬럼의 값이 원자성을 갖지 못하고 동일 속성의 값이 반복되고 있다.
그러므로 [친구이름] 컬럼을 분리하여 별도의 테이블을 만들고 부모 테이블의 기본키를 외부키로 하여 1:다의 관계를 설정한다.
DB모델링의 가장 기본적인 형태이다.
학생 테이블
학생번호 (PK) | 학생이름 | 친구이름 |
1 | 김인철 | 최재철 김창운 |
2 | 이성호 | 박진우 정동영 김한나 |
위의 테이블은 다음과 같이 2개의 테이블로 구성하여 1:다의 관계를 갖도록 한다.
학생 테이블 친구 테이블
|
|
# 함수적 종속성: 엔티티 내부의 속성간의 종속성
제 2 정규화 : 완전 함수적 종속성, 복합키 전체에 종속되지 않는 컬럼들을 분리한다(부분 종속성 제거).
다음 테이블에서 학생번호, 팀명은 복합키로 지정되어 있는데, 프로젝트명은 팀명에 따라 달라질 수 있으므로 팀명은 프로젝트명을 결정할 수 있는 속성이고, 이런 경우 프로젝트명은 팀명에 종속적이라고 한다. 프로젝트명은 복합키의 전체에 종속적이지 않고 복합키의 일부분인 팀명에 종속적이기 때문에 팀명과 프로젝트명을 분리하여 별도의 테이블로 구성해야 한다.
학생 테이블
다음 테이블에서 학생번호, 팀명은 복합키로 지정되어 있는데, 프로젝트명은 팀명에 따라 달라질 수 있으므로 팀명은 프로젝트명을 결정할 수 있는 속성이고, 이런 경우 프로젝트명은 팀명에 종속적이라고 한다. 프로젝트명은 복합키의 전체에 종속적이지 않고 복합키의 일부분인 팀명에 종속적이기 때문에 팀명과 프로젝트명을 분리하여 별도의 테이블로 구성해야 한다.
학생 테이블
학생번호(PK) | 학생이름 | 팀명(PK) | 프로젝트 명 | 점수 |
1 | 홍길동 | 팀 A | 안드로이드 A | 92 |
2 | 이성호 | 팀 B | 안드로이드 B | 98 |
위의 테이블이 제 2 정규화를 거치면 다음과 같은 형태로 분리될 것이다.
학생 테이블 프로젝트 테이블
|
|
# 이행적 함수종속성: 키가 아닌 속성에 종속되는 것
제 3 정규화 : 이행적 함수종속성 제거, 기본키에 종속적이지 않고 다른 일반컬럼에 종속적인 컬럼들을 분리한다.
아래의 컬럼 구성에서 팀 담당교수는 학생번호에 종속적이지 않고 팀번호에 종속적이다.
학생 테이블
아래의 컬럼 구성에서 팀 담당교수는 학생번호에 종속적이지 않고 팀번호에 종속적이다.
학생 테이블
학생번호(PK) | 학생이름 | 팀번호 | 팀 담당교수 |
1 | 박지성 | 1 | 홍록기 |
2 | 김연아 | 2 | 추성훈 |
위의 테이블이 제 3 정규화를 거치면 다음과 같은 상태가 될 것이다.
학생 테이블 팀교수 테이블
학생 테이블 팀교수 테이블
|
|
제 4 정규화 : 다대다 관계의 해소, 제 2 정규화를 거친 테이블은 다대다 관계가 있어서는 안된다.
예를 들어, 제 2 정규화를 통해서 학생테이블, 수강과목 테이블이 분리되었다고 할 때, 한 학생은 여러 과목을 수강할 수 있고, 한 과목은 다수의 학생들이 수강신청할 수 있으므로 이들 2개의 테이블 사이에는 다대다 관계가 있음을 알 수 있다. 다대다 관계는 현실에서는 존재하지만 DB 모델링에서는 표현할 수 없는 관계이기 때문에 이들 테이블 중간에 관계 테이블(Association Table)을 추가해서 1대다 - 다대1 관계로 변환한다.
학생 테이블 수강등록 테이블 수강과목 테이블
예를 들어, 제 2 정규화를 통해서 학생테이블, 수강과목 테이블이 분리되었다고 할 때, 한 학생은 여러 과목을 수강할 수 있고, 한 과목은 다수의 학생들이 수강신청할 수 있으므로 이들 2개의 테이블 사이에는 다대다 관계가 있음을 알 수 있다. 다대다 관계는 현실에서는 존재하지만 DB 모델링에서는 표현할 수 없는 관계이기 때문에 이들 테이블 중간에 관계 테이블(Association Table)을 추가해서 1대다 - 다대1 관계로 변환한다.
학생 테이블 수강등록 테이블 수강과목 테이블
|
|
|
중간에 추가된 관계 테이블에는 양쪽 테이블의 PK를 가져와서 복합키로 구성하는 것이 일반적인 방법이며, 이 때 복합키 전체에 일반 컬럼들이 완전종속되어야 한다. 그렇지 않으면 제 2 정규화를 위반하게 된다.