정규화(Normalization)

Database 2010. 9. 30. 14:33

<<정규화(Normalization)>>

 

* 함수의 종속성(Functional Dependency)
- 데이터들이 어떤 기준값에 의해 종속되는 현상을 지칭

- 결정자(determinent) --> 종속자(dependent)

  ex> 주민등록번호 --> (이름, 출생지, 주소)

 

 

1. 제1 정규화
- 복수의 속성값을 갖는 속성의 분리
- 즉, 테이블 하나의 컬럼에는 여러 개의 데이터 값이 중복되어 나타나지 않아야 한다.

- 모든 엔티티 타입의 속성에는 하나의 속성 값만을 가지고 있어야 하며 반복되는 속성 값의 집단은 별도의 엔티티 타입으로 분리한다.

- 로우(Row) 단위로 1차 정규화가 안된 모델은 PK의 유일성이 확보되지 않으므로 인해 실전 프로젝트에서는 거의 찾아보기 힘들다.

- 반면 로우 단위로 중복된 내용을 컬럼 단이로 펼쳐 중복하는 경우가 아주 많이 발견되는데 추가 업무 발생시 모델을 변경해야 하는 치명적인 결함이 있다.

 

 

2. 제2 정규화
- 주식별자에 종속적이지 않은 속성 분리
- 주식별자를 구성하는 일부 속성에 종속적인 속성(부분 종속 속성)을 분리하는 것.
- 주식별자가 둘 이상의 컬럼으로 이루어져 있을때 모두에게 종속적이어야 한다.

- 반드시 자신의 테이블을 주식별자를 구성하는 속성이 복합 식별자일 경우에만 대상이 되고 단일 식별자일 경우에는 2차 정규화 대상이 아니다.

- 코드 유형의 엔티티 타입들이 2차 정규화가 되지 않고 하나의 엔티티 타입으로 표현되는 경우가 많다.

 

 

3. 제3 정규화
- 주식별자가 아닌 속성에 종속적인 속성 분리.
- 주식별자에 의해 종속적인 속성 중에서 다시 속성 간에 종속관계(이전 종속)가 발생되는 경우

- 결정자 역할을 하는 일반 속성이 존재하고, 결정자 역할 속성에 의존하는 의존자가 존재하는 엔티티 타입이 대상이다.

 

 

4. 보이스-코드 정규화(BCNF)
- 테이블에 존재하는 식별자가 여러개 존재할 경우 식별자가 중복되어 나타나는 현상을 제거

- 주식별자 속성 중에 주식별자의 유일성을 확보하는 최소한의 속성이 아닌 쓸데없이 추가된 속성을 분리하는 것.

 

 

5. 제 4정규화
- 특정 속성값에 따라 선택적인 속성의 분리

- 하나의 테이블에 두 개 이상의 독립적인 다가속성(multi-valued attribute)이 존재하는 경우에 다가종속(multi-valued dependency)이 발생되어 문제가 생긴다. 다가종속이란 하나의 속성 값에 두개 이상의 의미를 가지는 값을 가지는 것을 의미한다.

- 실제로 2정규화나 BCNF보다 더 많이 발생된다.

- 불필요한 관계때문에 새로운 값을 채울 경우에 값을 기본값(Default value)으로 지정해버리는 경우가 많이 있다. 참조무결성(FK)를 걸지 않는 경우에 가능한데 좋지 않은 경우이며 이와 같은 경우 데이터모델에 나타난 관계가 실제 데이터에서 불가피하게 단절되어 나타나므로 무결성 체크가 불가능해진다.







원래 정규화란 중복성을 최소화하고 정보의 일관성을 보장하기 위한 관계형 데이터 베이스에서 제일 중요한 개념인데요

제1정규화는  < repeating group 제거>


여러 값을 가진 컬럼이 존재할 수 없다. 즉 반복되는 그룹이 존재해서는 안 된다. 각 행과 열에는 하나의 값만이 올수 있다.
예를 들면

고객번호(P.K) 고객명 취미
1 노무현 영화
여행
2 이화숙 등산

이런 테이블이 있을수는 없고 이걸 수정한다면

고객번호(P.K) 고객명
1 노무현
2 이화숙

하고 또하나

고객번호(P.K) 일련번호(P.K) 취미
1 1 영화
1 2 여행
2 1 등산

이런식으로 두개로 분리해야 한다는거죠

제2정규화 < 부분종속 제거 >


모든키가 아닌 컬럼은 기본 키 전체에 의존적이여야 한다. 기본키의 일부분에 의존적이어서는 안 된다.

예를 들어

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

이 테이블의 기본키는 사번과 프로젝트번혼데 부서 컬럼은 사번에만 의존적이다.
이것은 2정규화를 거치면

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

요렇게 하고 부서 테이블을 다시 따로 때네서

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

요렇게 해서 릴레이션을 걸면 됩니다.

그리고 3정규화 < 이행종속 제거 >


키가아닌 컬럼은, 다른 키가 아닌 컬럼에 의존적일어서는 안된다.
예를 들어

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

요 테이블을 다시 보면 고과율은 프로젝트 역할에 의존적인걸 알수 있습니다.

이것을 또 3정규화 거치면

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

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

요렇게 또 따로 때네줘야 합니다

제4정규화는
2정규화 된 테이블은 다대다 관계를 가질수 없다.

이건 따로 예를 안들어도 되겠죠?ㅋㅋ

Posted by Sting!
,