3 minute read

정규화(normalization)

  • 함수 종속성을 이용해 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해해서 이상 현상이 발생하지 않는 바람직한 릴레이션으로 만들어 가는 과정.
  • 정규화를 통해 릴레이션은 무손실 분해(nonloss decomposition)되어야 한다.
    • 릴레이션은 의미적으로 동등한 릴레이션들로 분해되어야 하고 분해로 인한 정보의 손실이 발생하지 않아야 한다.
    • 분해된 릴레이션들을 자연 조인하면 분해 전의 릴레이션으로 복원 가능해야 한다.

정규형(NF - Normal Form)

  • 릴레이션이 정규화된 정도
  • 각 정규형마다 제약조건이 존재
    • 정규형의 차수가 높아질수록 요구되는 제약조건이 많아지고 엄격해진다.
    • 정규형의 차수가 높아질수록 데이터 중복이 줄어 이상 현상이 발생하지 않는 바람직한 릴레이션이 된다.
  • 릴레이션의 특성을 고려하여 적합한 정규형을 선택한다.

제 1 정규형(1NF - First Normal Form)

  • 릴레이션의 모든 속성이 더는 분해되지 않는 원자 값(atomic value)만 가지면 제 1 정규형을 만족한다.
  • 제 1 정규형을 만족해야 관계 데이터베이스의 릴레이션이 될 자격이 있다.
  • 릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어 있으면 제 1 정규형에 속한다.

제 1 정규형 예시

고객아이디 이벤트번호 당첨여부 등급 할인율
A E01, E05, E10 Y, N, Y gold 10%
B E02, E05 N, Y vip 20%
C E03, E07 Y, Y gold 10%
D E04 N silver 5%

제 1 정규형을 만족하지 않는 릴레이션이다.

고객아이디 이벤트번호 당첨여부 등급 할인율
A E01 Y gold 10%
A E05 N gold 10%
A E10 Y gold 10%
B E02 N vip 20%
B E05 Y vip 20%
C E03 Y gold 10%
C E07 Y gold 10%
D E04 N silver 5%

제 1 정규형을 만족하는 릴레이션이다. 하지만 데이터의 중복으로 인한 이상 현상이 발생한다.

  • 함수 종속 관계
    고객아이디 -> 등급
    고객아이디 -> 할인율
    등급 -> 할인율
    (고객아이디, 이벤트번호) -> 당첨여부

  • 함수 종속 다이어그램

고객아이디 이벤트번호 당첨여부 등급 할인율
A E01 Y vip 10%
A E05 N vip 10%
A E10 Y gold 10%
B E02 N vip 20%
B E05 Y vip 20%
C E03 Y gold 10%
C E07 Y gold 10%
D E04 N silver 5%
E NULL NULL silver 5%

제 1 정규형은 만족하지만 이상 현상이 발생하는 릴레이션이다. A고객은 데이터 불일치로 인한 갱신 이상이 생기고, D고객은 데이터 손실로 인한 삭제 이상이 생기며, E고객은 삽입 불가로 인한 삽입 이상이 생긴다.
이상 현상의 발생 이유는 기본키에 완전 함수 종속되지 못한 등급과 할인율 때문이다. 기본키인 {고객아이디, 이벤트번호}에 완전 함수 종속되지 못하고 일부분인 고객아이디에 종속되는 등급과 할인율 속성이 존재하기 때문이다. 이 문제를 해결하려면 부분 함수 종속이 제거되도록 이벤트참여 릴레이션을 분해하면 된다. 분해된 릴레이션은 제 2 정규형에 속하게 된다.

제 2 정규형(2NF - Second Normal Form)

  • 릴레이션이 제 1 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형을 만족한다.

제 2 정규형 예시

  • 함수 종속 다이어그램
고객아이디 등급 할인율
A gold 10%
B vip 20%
C gold 10%
D silver 5%

고객 릴레이션

고객아이디 이벤트번호 당첨여부
A E01 Y
A E05 N
A E10 Y
B E02 N
B E05 Y
C E03 Y
C E07 Y
D E04 N

이벤트참여 릴레이션

고객 릴레이션과 이벤트참여 릴레이션은 모두 제 2 정규형에 속한다. 여기서 고객 릴레이션은 제 2 정규형을 만족하지만 이상 현상이 발생한다.

고객아이디 등급 할인율
A gold 15%
B vip 20%
C gold 10%
D silver 5%
NULL bronze 1%

A, C고객은 데이터 불일치로 인한 갱신 이상이 생긴다. gold등급의 할인율을 15%로 조정하기로 하고 일부 튜플만 갱신하게 되면 데이터 불일치가 발생한다.
B고객은 데이터 손실로 인한 삭제 이상이 생긴다. vip라는 등급을 가진 아이디가 B가 유일하다면 B를 삭제하였을 때 vip등급의 할인율이 함께 소실된다.
마지막 튜플은 삽입 불가로 인한 삽입 이상이 생긴다. bronze라는 등급을 새로 만들었을 때 등급이 bronze인 고객이 한명도 존재하지 않는다면 고객아이디가 NULL이 되므로 bronze등급의 할인율이 1%라는 정보를 삽입할 수 없게 된다.
이상 현상의 발생이유는 이행적 함수 종속이 존재하기 때문이다. 고객아이디는 등급을 결정하고 등급은 할인율을 결정하므로 고객아이디도 할인율을 결정하게 된다. 이 문제를 해결하려면 이행적 함수 종속이 제거되도록 고객 릴레이션을 분해하면 된다. 분해된 릴레이션은 제 3 정규형에 속하게 된다.

제 3 정규형(3NF - Third Normal Form)

  • 릴레이션이 제 2 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속되지 않으면 제 3 정규형을 만족한다.

제 3 정규형 예시

고객아이디 등급
A gold
B vip
C gold
D silver

고객 릴레이션

등급 할인율
gold 10%
vip 20%
silver 5%

고객등급 릴레이션

고객 릴레이션과 고객등급 릴레이션은 모두 제 3 정규형에 속한다.

정규화 예제

  • (학번, 이름, 지도교수, 학과이름, 학과전화번호, 과목번호, 성적, 시간, 회장이름, 동아리이름, 방번호)
  • 함수 종속
    • 학번 -> 이름, 지도교수, 학과이름, 회장이름, 동아리이름, 방번호
    • 학과이름 -> 학과전화번호
    • 과목번호 -> 시간
    • 학번, 과목번호 -> 성적
    • 회장이름, 동아리이름 -> 방번호

삽입/갱신/삭제 이상

수강신청을 하지 않은 학생에 대한 데이터는 릴레이션에 삽입할 수 없다. 기본키인 과목번호가 NULL이 되기 때문이다. 삽입을 하려면 임시 과목번호를 만들어야 하는 문제가 생긴다.

한 명의 학생이 여러 과목을 수강하면 동일한 학생에 대해서 학번으로 정해지는 속성들이 모두 중복되어 튜플에 기재된다. 여기서 지도교수를 변경했을 때 모든 튜플을 수정하지 않으면 동일한 학생에 지도교수가 달라지는 갱신 이상이 생긴다.

학생이 한 과목만 수강신청을 하면 학생에 대한 튜플이 하나만 존재하게 된다. 여기서 수강신청을 취소하면 과목번호에 대한 정보인 시간도 함께 삭제된다.

제 2 정규형

모두 원자값으로 구성되어 있어 제 1 정규형을 만족한다고 가정.

제 3 정규형

학점(과목번호, 학번, 성적)
학생(학번, 이름, 지도교수, 학과이름, 회장이름, 동아리이름)
과목(과목번호, 시간)
학과(학과이름, 학과전화번호)
동아리(회장이름, 동아리이름, 방번호)

Leave a comment