DB

정규화 과정

무니버 2010. 11. 19. 14:04

 

 

정규화?

 

고유한 식별자를 가지는 모든 개체(ENTITY = DB의 테이블)더 이상 분리할수
없는 상태로 나누는 과정.

 

=> 불필요한 중복된 데이터를 제거, 정규화를 통한 개체의 분리는 관계가 있는
개체간의 참조 관계로 데이터를 유지보수하게 된다. 정규화 수준을 높이면

 

<장점>
데이터의 크기가 작아지기 때문에 갱신 및 처리 속도면에서 유리하고 같은 데이터가
어려 개체에 분산된것보다 일관성을 유지하기 쉽다.

 

<단점>관계된 여러 속송을 돗이에 조회하기위해 JOIN과정에서는 어려움을 가질수 있다.
      호단 여러 개체에 동시에 반영해야하는 작업의 경우 명시적으로 TRANSACTION 처리
      해야하 는 수고가 따른다.


<참고> 역정규화(비정규화)
       - 정규화 과정을 수행하고나서 수행속도나 프로그램을 구현하기 어려운 경우에는
         역정규화 과정으로 문제를 해결함


 

 

다음과같은 자료를 정규화를 해보자.

 

 

 

 

 


1.제1 정규화

-  COLUMN에 같은 값들이 반복되어나오면 이 칼럼들을 분리해서 새로운 테이블을만들어야한다. 즉, 다른개체로 판단할수 있는

    COLUMN을 분리한다.
               

  이렇게되면 부모테이블과 자식테이블로 나뉘어지게 되는데 부모테이블의 PK는 FK키로 전이된다.

 

여기서는 교수명과 강의실등은 반복되고 있으므로 분리가능하다.

일단 과목테이블과 학생테이블로 나누어보자. 과목테이블을 먼저 만들어야 학생테이블 을 연계시킬수 있으므로 과목테이블에 PK를

지정하게되며

 

과목테이블 = 부모테이블
학생테이블 = 자식테이블

 

 

                                                                <과목테이블>

 

 

                                                         <학생테이블>

                                         <참고 학생테이블에서 과목번호와 교수번호는 부모테이블인 과목테이블에서 전이된것이지만

                                         학생테이블자체로만보면 학번,과목번호,교수번호는 COMPOSITE PK를 이룬다.>

 


여기서는 단일이 아닌 2개이상 COLUMN으로 묶은 COMPOSITE PK를 적용해야한다.
과목번호화 교수번호를 묶어서 Pk구성했다. 그리고 과목테이블의 PK는
자식테이블인 학생테이블로 전이되서 FK가되였다.

 

<참고> 쿼리문에서 PK,FK지정

 

복합 PK지정은
CONSTRAINT 제악조건명 PRIMARY KEY (과목번호, 교수번호)

 

FK지정

CONSTRAINT 제약조건명 FOREIGN KEY(과목번호,교수번호)
REFERENCES 부모테이블명(과목번호,교수번호)

 

 

 

2.제2 정규화

 

 

단일 PK의 경우는 이 정규화가 필요없으나.
COMPOSITE PK로 되어진 테이블의 경우는 제2 정규화를 해야한다.

 

식별자가 아닌 COLUMN은 식별자 전체 COLUMN에 대해 의존적이어야하는데
식별자 일부 칼럼에 대해 의존적이라면 그 COLUMN은 분리해서 새로운 개체를 만든다.


예를들면 위의 과목테이블에서 과목명은 과목번호에게 의존적이지만, 전체 Composite PK인 과목명과
교수번호에 전체에 대해 의존적이지 않으므로 분리한다.

(즉 과목명이 다르면 과목번호도 다르게 된다. 그러나 과목명과 교수명은 아무런 상관없다.

 과목이 같아아도 교수는 다른 사람이 같은 과목을 가르칠수 있거나 하기때문에  둘의 연관성이 없다.)

 

 

중복된 필드값를 제거하고 분리하면  아래와같은 테이블처럼 만들수 있다.

 

 

 

                                                                             <개설과목 테이블>

 

교수명또한 마찬가지이다. 교수명을 교수번호와는 관련있으나 과목명과는 상관없으므로 새롭게 테이블을 만들면




                                                                             <교수 테이블>




그리고 교수명과 과목명을 분리한 나머지 남은 항목의 테이블




                                                                           <강의실관련 테이블>


학생테이블 또한 마찬가리 제2 정규화과정을 거치면 2가지 테이블이 생긴다

학번의 경우 아래처럼 학번,과목번호,교수번호의 COPOSITE PK를 가지므로 분리해아한다.

 



<학생개인정보 테이블>

 



<성적테이블>

 


현재 학점은 학생테이블의 PK(노란색칠한 필드) 전체에 대해 의존적이므로 그대로 둔다.
 반면 학점 COLUMN은 학번에게만 의존적이므로 분리한다. 그럼 위에처럼 분리된다.

결국 학생테이블이 2개의 테이블로 분리된다.

 

 

 

 

3.제3 정규화

 

식별자가 아닌 컬럼이 식별자가 아닌 칼럼에 대해 의존적이라면 그 칼럼을 분리해서 새로운 개체를 만든다.

 

위에서 <강의실관련>테이블의경우 강의실코드와 강의실코드는 서로 의존적이므로
분리할수 있다.

 



 



4.제4 정규화



제4정규화는 '데이터베이스의 연관관계'를 多:多 관계 ->1:多 관계  바꾸는 과정이다


예를들면 다음과 같이 고객이 과자를 사는 프로세싱과 관련된 데이터베이스를 살펴보면


  <회원> 테이블                        <제품> 테이블

            1행                                     多행
            多행                                     1행
 ----------------                ---------------
 회원ID  .... 회원명 ...                 제품코드... 단가 ...
 ----------------                ---------------
  P.K                                          P.K

 CNS          최남선                     새우깡       1000
 CJM          최종민                     양파링       1500
 PYM          박영민                     감자깡         800


다음과같이 회원테이블과 제품테이블은 서로 多:多 관계를 맺고 있음을 알고 있다.

이러한것을 각기 부모테이블로 하는 하나의 테이블로 구성해보자



               <주문> 테이블
               ------------------------------
               회원ID   제품코드   주문일자   주문량
               -----   ------
                 F.K        F.K

                 CNS     새우깡       SYSDATE    50
                 CNS     감자깡       SYSDATE    30
                 CJM     새우깡       SYSDATE    25



위와 같은 하나의 자식테이블을 구성할수 있는데.
이때 새로운테이블은 PK로 회원ID,제품코드,주문일자 모두로 가지게 된다.
조금 복잡해보인다. 이 요소들을 하나의 특성으로 묶어 주문번호라는
COLUMN을 새로만들어 PK로 지정하면 더 효율적이다.

              <주문> 테이블
             -----------------------------------
             주문번호  회원ID   제품코드   주문일자   주문량
             ------   -----   ------
               P.K          F.K        F.K

               1           CNS     새우깡       SYSDATE    50
               2           CNS     감자깡       SYSDATE    30
               3           CJM     새우깡       SYSDATE    25




이렇게되면 회원테이블과 주문테이블관계는 1: 多 관계가되며

제품테이블과 주문테이블의 관계도 1: 多 관계가 된다.

 

즉 새로만들어진 주문테이블을 매개체로하여 다대다 관계테이블이

1:다 테이블 2개로 나누어지게 만들수 있다.



 


 

 

 

 

12.bmp
0.06MB
12.bmp
0.06MB

'DB' 카테고리의 다른 글

역정규화  (0) 2010.12.02
개체간 연관관계  (0) 2010.11.19
단일 Primary Key와 복합 Primary Key  (0) 2010.11.19
DML, DDL, DCL 문이란?  (0) 2010.11.18
데이터 베이스란?  (0) 2010.11.01