제1정규화 : "모든 속성은 반드시 하나의 값을 가져야 한다.(반복적인 형태가 있어서는 안된다)"
- 여러값을 가진 컬럼이 존재할수 없다. 즉, 다시 말해서 반복되는 그룹이 존재 해서는
안되며, 각 행과 열에는 오직 하나의 값만이 존재해야 한다.
고객번호 |
고객명 |
취미 |
1 |
홍길동 |
연화 |
|
|
여행 |
2 |
마징가 |
등산 |
위의 예에서 고객번호 1 인 홍길동은 2가지의 취미를 자지고 있다.
이러한 그룹이 존재하게 되면 제1정규화의 대상이 된다. 아래와 같이 수정 한다.
고객번호 |
고객명 |
1 |
홍길동 |
2 |
마징가 |
고객번호 |
일련번호 |
취미 |
1 |
1 |
영화 |
1 |
2 |
여행 |
2 |
1 |
등산 |
제2정규화 : 부모와 자식간 "모든 속성은 반드시 UID 전부에 종속 되어야 한다.
(UID 일부에만 종속되어서는 안된다)"
- 모든 키가 아닌 컬럼은 기본키 전체에 의존적이어야 한다.
기본키의 일부분에 의존적이어서는 안된다.
사번 |
프로젝트번호 |
부서 |
프로젝트역할 |
고과율 |
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 |
기획 |
제3정규화 : 형제간 "UID 가 아닌 속성간에는 서로 종속될수 없다.(종속간 종속성 배제)"
- 키가 아닌 컬럼은 다른키가아닌 컬럼에 의존적이어서는 안된다.
사번 |
프로젝트번호 |
프로젝트역할 |
고과율 |
1 |
a |
팀장 |
A |
1 |
b |
팀원 |
C |
1 |
c |
부팀장 |
B |
2 |
c |
팀장 |
A |
3 |
c |
팀장 |
A |
앞서 제2정규화를 거친 테이블이지만 아직도 고과율 컬럼은 프로젝트 역할에 따라
변하고 있음을 알수 있다. 즉, 고과율은 키가 아닌 프로젝트역할 컬럼에 의존적 이다.
사번 |
프로젝트번호 |
프로젝트역할 |
1 |
a |
팀장 |
1 |
b |
팀원 |
1 |
c |
부팀장 |
2 |
c |
팀장 |
3 |
c |
팀장 |
프로젝트역할 |
고과율 |
팀장 |
A |
팀원 |
C |
부팀장 |
B |
제4정규화 : 3NF 테이블은 의존적인 n : n (다 대 다) 관계를 가질수 없다.
학번 |
이름 |
과목번호 |
과목명 |
1 |
홍길동 |
K |
국어 |
2 |
마징가 |
K |
국어 |
3 |
슈퍼맨 |
K |
국어 |
3 |
슈퍼맨 |
M |
수학 |
3 |
슈퍼맨 |
E |
영어 |
2 |
마징가 |
H |
역사 |
2 |
마징가 |
P |
정치 |
1 |
홍길동 |
P |
정치 |
이 테이블은 아래와 같은 2 개의 테이블로부터 나온것 이다.
과목번호 |
과목명 |
K |
국어 |
M |
수학 |
E |
영어 |
H |
역사 |
P |
정치 |
< 다 : 다 >
학번 |
이름 |
1 |
홍길동 |
2 |
마징가 |
3 |
슈퍼맨 |
위의 테이블은 학생과 과목간의 관계가 다 : 다 관계이다. 이를 해결하기 위해
아래와 같이 나눈다.
과목번호 |
과목명 |
K |
국어 |
M |
수학 |
E |
영어 |
H |
역사 |
P |
정치 |
< 1 : n >
학번 |
일련번호 |
과목번호 |
1 |
1 |
K |
1 |
2 |
P |
2 |
1 |
H |
2 |
2 |
P |
2 |
3 |
K |
3 |
1 |
K |
3 |
2 |
M |
3 |
3 |
E |
< n : 1 >
학번 |
이름 |
1 |
홍길동 |
2 |
마징가 |
3 |
슈퍼맨 |
비정규화 (Denormalization)
정규화를 하는것은 되도록 중복된 데이터를 제거해서 성능 향상에 도움을 주는것에 목표를
두고 있다. 그러나 경우에 따라서는 나누어 놓은 테이블을 성능 향상의 목적으로 다시
합쳐야 할 경우가 생길수 있다. 나누어 놓은 테이블을 함께 연결해서 사용 하려면
JION 이라는 방법을 사용 하는데, 이를 위해서는 어느 정도의 부하가 걸릴수 있다.
따라서 지나치게 자주 JOIN을 사용 한다면 차라리 테이블을 다시 합치는것에 대하여
고려해볼 필요가 있다. 이렇게 성능 향상을 위하여 다시 테이블을 합치는것을 "비정규화"
라고 하며, 보통은 정규화 과정을 거친후 마지막 단계에서 비정규화를 실시 한다.
물론 처음부터 비정규화를 할수도 있다.
꼭 테이블을 합치는것만이 비정규화는 아니다. 아래와 같은 경우에도 비정규화에 해당된다.
1. 그룹에 대한 합계와 같은 값을 미리 계산하여 테이블에 저장해 둔다.
(일반적으로 트리거가 필요하게 된다)
(예) 판매 테이블에 새로운 데이터가 변경될때 마다 제품 테이블의 총 판매 수량 컬럼이
변경 된다.
2. 한테이블에서 자주 사용되는 행(레코드)들과 그렇지 않은 행들을 분리하여 2개의
테이블로 둔다. (이런경우에는 UNION 으로 다시 연결시킬수 있다)
(예) 고객 테이블에 200만건의 고객이 있을 경우, 그중 약 10%에 해당되는 20만명의
고객들만이 자주 거래를 하고 나머지 고객들은 1년이 넘게 거래가 없다고 하면,
이 두 부류를 2개의 테이블로 나누어 관리 한다.
3. 다른 테이블에 의존적이지만 자주 JOIN 에서 사용되는 컬럼을 중복하여 테이블안에
하나 더 만든다.
'연구개발 > DBA' 카테고리의 다른 글
MCITP 취득 방법 (0) | 2010.05.25 |
---|---|
ER-모델링 (0) | 2009.09.27 |
데이터베이스 호환성 수준 변경 (0) | 2009.07.29 |
SERIALIZABLE과 REPEATABLE READ시 Lock 테스트 (0) | 2009.07.29 |
Create Directory SQL (0) | 2009.07.29 |