본문 바로가기

Programming/DataBase

[DataBase] 정규화 (Normalization)

정규화의 개념

- 가장 작은 논리적 단위로 Table을 분리하고 중복을 제거하여 이상을 제거/ 공간의 효율적 활용하는 것.


정규화 과정

아래의 <주문목록> 테이블을 가지고 정규화 과정을 살펴보자. <주문목록> 테이블의 기본키(Primary Key)는 제품 번호 이다.


제 1 정규형

- 반복된 속성 제거, 새로운 테이블 추가 (중복제거)

- 테이블에 속한 모든 속성의 도메일이 원자값(Atomic Value)만으로 되어 있는 정규형이다. 즉, 테이블의 모든 속성 값이 원자 값으로만 되어 있는 정규형이다.


ex)위의 <주문 목록 테이블에서는 하나의 제품에 대해 여러 개의 주문 관련 정보(주문번호, 고객번호, 주소 , 주문수량)가 발생하고 있다. 따라서 <주문 목록> 테이블은 제 1정규형이 아니다.


다음은 제 1 정규형을 만족하도록 위의 테이블에서 반복되는 주문 관련 정보를 분리하여 제1정규형으로 만든것이다.


- 1차 정규화 과정으로 생성된<제품 주문> 테이블의 기본키는 (주문번호, 제품번호)이고, 다음과 같은 함수적 종속이 존재한다.


주문번호, 제품번호 -> 고객번호, 주소, 주문수량

  주문번호 -> 고객번호, 주소

  고객번호 -> 주소

부분 함수적 종속 문제 발생.


제 2정규형

테이블이 제1정규형이고, 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족하는 정규형이다.


다음은 <제품주문> 테이블에서 주문번호에 함수적 종속이 되는 속성들을 분리하여 제2정규형을 만드는 것이다.


제 2정규화 과정을 거쳐 생성된 <주문> 테이블의 기본키는 주문번호이다. 그리고 <주문>테이블에는 아직도 다음과 같은 함수적 종속들이 존재한다.


주문번호(A) ->고객번호(B),주소

고객번호(B) ->주소(C)


A->B,B->C  =>  A->C 를 만족하는 이행적 함수 종속 문제 발생. 


제 3정규형

- 제 3정규형은 테이블이 제 2정규형이고 기본키가 아닌 모든 속성이 기본키에 대해 이행적 함수적 종속(Transitive Functional Dependency)을 만족하지 않는 정규형이다. 

- 키가 아닌 속성들은 기본키에 의존해야함.

<주문> 테이블에서 이행적 함수적 종속을 제거하고 제3정규형을 만들면 다음과 같다.

BCNF

- 테이블에서 모든 결정자가 후보키(Candidate Key)인 정규형이다.


다음 <수강_교수> 테이블에서 결정자 중 후보키가 아닌 속성이 존재한다. 즉, 함수적 종속 담당교수->과목명이 존재하는데, 담당교수가<수강_교수>테이블에서 후보키가 아니기 때문에 <수강_교수> 테이블은 BCNF가 아니다.


<수강_교수>테이블에서 BCNF를 만족하지 못하게 하는 속성(즉, 담당교수 -> 과목명)들을 분리해 내면 위와 같이 BCNF인 <수강>테이블과 <교수>테이블로 무손실 분해된다.


제4정규형 

- 테이블에 다중 값 종속(MVD:Multi Valued Dependency) A ->> B가 존재할 경우의 모든 속성이 A에 함수적 종속 관계를 만족하는 정규형이다.


제5정규형

- 테이블의 모든 조인 종속(JD:Join Dependency)이 테이블의 후보키를 통해서만 성립되는 정규형이다.



* 무손실 분해 (Nonless Decomposition)

테이블 R의 프로젝션(특정 테이블에서 일부 속성들만 추출하여 만든 테이블)인 R1,R2가 NATURAL JOIN을 통해 원래의 테이블 R로 정보 손실 없이 복귀되는 경우 R은 R1과 R1로 무손실 분해 되었다고 한다.


* 결정자 / 종속자

'학번'에 따라 '이름'이 결정되는 '학번 -> 이름'일 때 '학번'을 결정자라 하고, '이름'을 종속자라고 한다.


*다중값 상속

A,B,C 3개의 속성을 가진 테이블에서 어떤 복합 속성(A,C)에 대응하는 B값의 집합이 A 값에만 종속되고 C값에는 무관하면, B는 A에 다중 값 종속이라 하고, A->>B로 표기한다.

'Programming > DataBase' 카테고리의 다른 글

[DataBase] 함수적 종속 (Functional Dependency)  (0) 2013.06.28
[DataBase] 이상 (Anomaly)  (0) 2013.06.28
[DataBase] 스토어드 프로시저 (Stored Procedure)  (0) 2013.06.28
내장 SQL  (0) 2013.06.26
SQL - DCL  (0) 2013.06.26