catbook 종원's 블로그 이사 온 블로그

DB 정규형 1NF, 2NF, 3NF

» School

정규화란?

영어로는 nomalization.
함수의 종속성(Functional Dependency)을 이용하여 서로 연관된 속성끼리 연결하고 삽입,삭제, 변경이상을 없게 만드는 과정을 말한다. 정규화된 정도에 따라 1NF, 2NF, 3NF, BCNF, 4NF, 5NF (NF: Normal Form) 으로 분류가 되며 숫자가 커질수록 제약조건이 까다로워진다. (함수의 종속성과 이상현상 공부 여기 )



1NF(First Normal Form)

모든 도메인이 원자값(automic value)인 릴레이션.
관계형 데이터베이스의 대표적인 특징중 하나가 모든 도메인이 원자값(automic value)으로 이루어져있다는 것이다.

1NF_1

  • 삽입이상
    500번 학생과 지도교수가 P4 라는 사실을 삽입하려 할 때 어떤 과목을 등록하지 않는 한 삽입할 수 없다.
  • 삭제이상
    200번 학생이 C123등록을 취소하여 이 튜플이 삭제되면 200번 학생의 지도교수가 P2라는 사실도 같이 삭제된다.
  • 갱신이상
    400번 학생의 지도교수를 P3로 바꾸려면 400번 학생의 모든 튜플의 지도교수를 다 바꿔야한다.
1NF의 이상원인
기본 키값의 부분함수종속이 존재하기 때문.
위 경우에서 수강지도 릴레이션은 학번과 과목번호로 튜플들을 unique하게 나눌수 있음.
종속관계를 살펴보면 다음과 같다.
 성적 -> {학번, 과목번호}  
 학과, 지도교수 -> {학번}
 학과 -> 지도교수

성적은 학번과 과목번호에 종속되는 반면 학과와 지도교수는 학번에만 종속되는 부분함수종속이 존재한다. 부분함수종속되는 애트리뷰트들이 불필요하게 중복되는것이 이상을 야기한다. 즉 부분함수종속의 존재가 이상이 일어나는 원인이다.

2NF(Second Normal Form)

1NF의 이상을 해결하기 위해서 부분함수종속되는 애트리뷰트들을 따로 분리시킬 수 있다.(중복이 줄어듦) 이렇게 부분함수종속을 분리하여 모든 애트리뷰트들이 기본키에 완전 함수종속이 되게 하면 이를 2NF라 한다.

2NF_1

이 릴레이션들의 함수종속을 살펴보면 다음과 같이 모두 완전한수종속인 것을 확인 할 수 있다.

2NF_2

그러나 2NF에서도 이상이 존재한다.

  • 삽입이상
    어떤 지도교수가 특정학과에 속한다는 사실을 삽입할 수 없음. 키값이 학번이므로..
  • 삭제이상
    학번 300을 삭제하면 지도교수 P3가 컴퓨터학과에 소속된다는 사실도 삭제된다.
  • 갱신이상
    지도교수 P1의 소속을 컴퓨터과에서 전기과로 바꾼다면 학번 100번과 400번 모두 바뀌어야한다.
2NF의 이상원인
지도 릴레이션의 종속관계를 살펴보면
학번 -> 지도교수
학번 -> 학과
지도교수 -> 학과 

인데 이처럼 A -> C, A -> B, B -> C 일 때 C를 A의 이행적 종속 이라 말한다.
이러한 이행적 함수종속으로 인해 이상현상이 일어난다.



# 3NF(Third Normal Form)
2NF에서 이행적 함수관계들을 모두 제거한 것이 3NF이다.
2NF를 프로젝션하여 만든다.

3NF_1

3NF_2

학생지도 릴레이션의 지도교수는 지도교수학과 릴레이션의 외래키가 된다.
모든 이원릴레이션은 3NF에 속한다.
약점: 복수의 후보키가 있고 후보키가 복수의 애트리뷰트로 이루어져있고 후보키에서 중첩이 있다면 3NF를 적용 할 수 없다.

3NF_3 3NF_4

한 과목을 여러명의 교수가 맡을 수 있다는 제약조건의 릴레이션이다.
이행적 함수종속이 없으므로 3NF이다.

 후보키: {학번, 교수}, {학번, 과목}  
 복수의 후보키 & 후보키중 중첩 애트리뷰트 {학번} 존재  
  • 삽입이상: 교수 P5가 프로그래밍을 맡는다는 튜플을 삽입하면 무조건 학생 한명을 같이 삽입해야한다.
  • 삭제이상: 학번 100번이 자료구조를 수강한다는 사실을 삭제하면 담당교수가 P2라는 사실도 삭제된다.
  • 갱신이상: 프로그래밍의 담당교수를 P5로 바꾸면 모든 P1을 다 바꿔야한다.

이상의 원인: 교수가 결정자(determinent)이지만 후보키가 아님.