본문 바로가기

프로그램/ETC

DB Normalization

제1정규화(Normal Form): 하나의 Attribute에 들어있는 Domain은 원자값으로.

 

 사번    부서          프로젝트       

 3212    SOC       인천국제공항01

 8854    금융1      은행카드03, 대출관리01

 1205    통신        T-WORLD04

 

이런식으로 있다고 할 때, 8854번 과장이 2개의 프로젝트를 맡았다고 해도 한 칸에 2개의 값이 들어가면 안된다.

따라서 이것은 아래와 같이 바꾸어 주어야 한다.

 

 사번    부서          프로젝트       

 3212    SOC       인천국제공항01

 8854    금융1      은행카드03

 8854    금융1      대출관리01

 1205    통신        T-WORLD04

 

 

 

 

제2정규화: 제1정규형에 속하고, 기본키(Primary Key)가 아닌 모든 키는 기본키에 종속이어야 한다.

 

 사번       프로젝트          기여도          고객사     

 3212     인천국제공항01         A           인천국제공항

 8854        은행카드03            B           국민은행 

 8854        대출관리01            A           우리금융

 0071        대출관리01            C           우리금융

 1205       T-WORLD04           C           SK텔레콤

 

 

여기서 (사번, 프로젝트)를 Super Key라고 할 때,

어떤 사원이 어떤 프로젝트에 얼마나 기여했는지를 판단할 때에는 사번과 프로젝트가 모두 필요하지만,

고객사가 누구인지는 어떤 프로젝트인지만 보면 되고 사번은 필요하지 않다.

 

따라서 이것은 아래와 같이 2개의 Table로 바꾸어 주어야 한다.

 

 사번       프로젝트          기여도       

 3212     인천국제공항01         A        

 8854        은행카드03            B        

 8854        대출관리01            A   

 0071        대출관리01            C                 

 1205       T-WORLD04           C         

      

 

   프로젝트                고객사     

 인천국제공항01      인천국제공항

 은행카드03            국민은행 

 대출관리01            우리금융

 T-WORLD04           SK텔레콤

 

 

 

 

제3정규화: 제2정규형에 속하고, 기본키가 아닌 모든 키가 다른 키에 종속이면 안된다.

 

 사번    부서     부서전화      

 3212    SOC      1234

 2132    SOC      1234

 8854    금융1     2235

 1205    통신       9123

 

여기서 부서전화는 부서에 종속적이다.

따라서 이것은 아래와 같이 2개의 Table로 바꾸어 주어야 한다.

 

 사번    부서   

 3212    SOC      

 2132    SOC      

 8854    금융1     

 1205    통신       

 

부서     부서전화   

SOC      1234

금융1     2235

통신       9123

 

 

 

 

BCNF(Boyce-Code NF: 보이스코드 정규화): Relation의 모든 결정자가 후보키이면 BCNF에 속한다.

비결정자에 대한 함수종속을 제거해서 만들 수 있다.

 

 사번          OJT         사내강사    

 3212              DB               2231        

 8854             UNIX             1315

 8854             J2EE             6711

 1205             UNIX             0734

 

사내강사는 사번이나 OJT에 종속적이지 않고 (사번, OJT)에 종속적이므로 3정규형까지 만족한다.

 

(사번, OJT)는 사내강사를 결정한다.

또한 각 강사가 가르치는 OJT과목은 정해져 있으므로 사내강사는 OJT를 결정한다.

(사번, OJT) → 사내강사, 사내강사 → OJT

 

여기서 (사번, OJT)는 후보키이지만, 사내강사는 후보키가 아니므로 BCNF가 아니다.

따라서 이것은 아래와 같이 Table을 추가해야 한다.

 

(사원 OJT신청 테이블)

 사번          OJT         사내강사(외래키)    

 3212              DB               2231        

 8854             UNIX             1315

 8854             J2EE             6711

 1205             UNIX             0734

 

(개설 OJT 테이블)

 사내강사        OJT      

   3212              DB 

   8854             UNIX

   8854             J2EE

   1205             UNIX

 

 

 

제4정규화: 다중치 종속(MVD)이 있을때 이를 제거한 형태

 

 OJT        사내강사      강의장소 

  DB               A             803호

  DB               B             803호

  DB               A           세미나룸

  DB               B           세미나룸

 UNIX             A            실습실1

 UNIX             A            실습실2

 

사내강사와 강의장소 사이에는 어떤 관계가 없지만,

같은 OJT 과목이라도 사내강사가 여럿일 수 있고, 강의장소도 여러군데 일 수 있다.(다중치종속)

따라서 이것은 아래와 같이 2개의 Table로 바꾸어 주어야 한다.

 

 OJT        사내강사     

  DB               A           

  DB               B           

 UNIX             A                  

 

 OJT         강의장소 

  DB            803호

  DB          세미나룸

 UNIX         실습실1

 UNIX         실습실2

 

 

 

제5정규화: 어떤 Relation을 분해했을 때, 분해된 Relation을 join하면 원래의 Relation이 나와야 한다.

그렇지 못한 경유는 제5정규화를 해야 한다.

 

 OJT        사내강사          교재    

  DB               A             DB이론

  DB               B             DB이론

  DB               B             실습교재

 

이것을 아래와 같이 2개의 테이블로 나누었다고 하자.

 (A)테이블

 OJT        사내강사     

  DB               A                  

  DB               B        

 

 (B)테이블

 OJT           교재    

  DB           DB이론

  DB          실습교재

 

(A)와 (B)의 테이블을 Natural JOIN하면 아래처럼 되버린다.

 

 OJT        사내강사          교재    

  DB               A             DB이론

  DB               A             실습교재  ←잘못된 tuple

  DB               B             DB이론

  DB               B             실습교재

 

따라서 아래와 같이 (C)의 테이블을 추가해서 Natural Join 하여야 한다.

(C)테이블

 사내강사          교재    

      A             DB이론

      B             DB이론

      B             실습교재


출처 : http://blog.naver.com/PostView.nhn?blogId=electronchoi&logNo=50028431118&redirect=Dlog&widgetTypeCall=true
 

 

[출처] DB 정규화|작성자 전자맨