티스토리 뷰

★ Database

데이터 베이스 정규화(예시)

유쾌한 개발자 anyjava 2009. 5. 1. 10:37
데이터 베이스 정규화

: 불만족스러운 나쁜 릴레이션의 애트리뷰트 들을 나누어서 더 작은 "좋은" 릴레이션으로 분해하는 과정


1NF
 : 도메인이 원자값인 데이터베이스

 고객번호
 고객명  취미
 1  박보아  당구, 등산
 2  손현태  야구

위와 같은 테이블이 있을때 1번고객의 취미가 2개로서 도메인값이 원자값이 아니게 된다.
이부분에서 제 1정규화를 이용해서 정규화를 한다면 다음과 같은 테이블로 분리된다.

고객번호
 고객명
 1  박보아
 2  손현태

 고객번호  일련번호  취미
 1  1  당구
 1  2  등산
 2  1  야구

일련번호는 해당 취미가 여러개이기때문에 구분하기 위해 사용하는 애트리뷰트이다.

2NF

 : 부분적 함수종속성을 제거하는 것이다.

** 함수적 종속성 (FD : Functional Dependency) : 하나의 속성이 다른 속성의 유일함을 결정하는것 예, 주민번호가 이름을 결정

예를 들어 다음 테이블을 보도록하자.

 사번  프로젝트번호  부서 프로젝트 역할
고과율
 1  a  전산  팀장 A
 1  b  전산  조원  C
 1  c  전산  부팀장  B
 2  c  경리  팀장  A
 3  c  기획  팀장  A

위와 같은 테이블이 있을 때, 사번, 프로젝트번호 두개가 기본키인데 부서 칼럼은 사번에 의해서만 함수적 종속성을 지닌다.
즉, 기본키에 대해 부분적 함수적 종속성을 가지게 되는 것이다. 이를 제 2정규화 과정을 거치면 다음과 같다.

 사번  프로젝트번호  프로젝트역할  고과율
 1  a  팀장 A
 1  b  조원  C
 1  c  부팀장  B
 2  c  팀장  A
 3  c  팀장  A

 사번  부서
 1  전산
 2  경리
 3  기획

이렇게 해서 테이블을 두개로 나누고 릴레이션을 걸게 되면 된다.


3NF

 : 이행적 함수적 종속성을 제거하는 것이다.

다음 테이블을 보자.

 사번  프로젝트번호  프로젝트역할  고과율
 1  a  팀장 A
 1  b  조원  C
 1  c  부팀장  B
 2  c  팀장  A
 3  c  팀장  A

위 테이블에서 고과율은 기본키가 아닌 프로젝트 역할에 의존적이다. 즉, 둘 사이에 함수적 종속성이 존재하는 것이다.

그래서 이것을 또 제 3정규화 과정을 거치게 되면,

 사번  프로젝트번호  프로젝트역할
 1  a  팀장
 1  b  조원
 1  c  부팀장
 2  c  팀장
 3  c  팀장

 프로젝트역할 고과율
 팀장  A
 조원  C
 부팀장  B

이렇게 두개의 테이블로 나누어 지게 된다.

BCNF정규화

: 3정규형에서 BCNF 정규혀잉 되려면 비결정자에 의한 함수종속을 제거해야 하는것 입니다.
비결정자에 의한 함수종속을 제거 해서 분해된 BCNF정규형은 결과적으로 모든 속성들이 후보키로서 사용이 가능한 형태로 분해됩니다. 다시말해 분해된 테이블의 모든 결정자들이 후보키이면 BCNF정규형이라 말합니다.

4NF

: 테이블 내에서 N:M의 관계를 가지는 속성들을 분리해 내는것입니다.

 학번 이름
과목번호
과목명
       
       


이러한 테이블이 존재할때, 학번, 이름과 과목번호, 과목명은 서로 N:M의 관계를 이루어 지는것을 알수 있습니다.
따라서 다대다 관계일 때 다대다 관계를 없앨수 있는 테이블을 생성해주는 것이다.

즉, 다음과 같이 3개의 테이블로 구성이 되면 된다.

 과목번호  과목명
   

1:N 관계

 학번 일련번호
과목번호
     

M:1 관계

 학번 이름
   

이렇게 나누어 지게 된다.

5NF 는 실무에서 안쓰인다고 하니 생략하겠습니다.
반응형

'★ Database' 카테고리의 다른 글

RDB의 성능측면의 특징  (0) 2009.12.07
데이터 베이스 정규화(예시)  (0) 2009.05.01
데이터베이스 정규화에 대해서  (0) 2009.04.20
[DB 이야기] 인덱스 이용하기.  (0) 2008.08.29
댓글
댓글쓰기 폼