본문 바로가기
학교 전공/데이터베이스

데이터베이스 개론(3판) - 9장 정규화

by 응가1414 2023. 12. 6.

09 장 정규화.md
0.04MB

09장 정규화

9-1 정규화의 개념과 이상 현상

9-2 함수 종속

9-3 기본 정규형과 정규화 과정

9-4 요약

9-5 연습문제

  • 데이터 베이스가 싫어 하는 중복이 많이 나타나고
  • 이미 설계한 릴레이션에 이상한 문제가 발생하지 않게 하려면
  • 싫어하는 동물과 같이 안 살면 되는 것처럼, 하나의 릴레이션에 관련 없는 속성이 들어가지 않게 하고
  • 친한 속성끼리 릴레이션을 구성
  • 이 기준에 따라 릴레이션을 구성하는 방법인 정규화를 소개하고자 한다.
  • 필요한 함수 종속성의 개념을 이해하고 실제 예를 통해 정규화 과정을 연습해볼 수 있다.

image-20231117085513414

9-1 정규화의 개념과 이상 현상

9-1-1 정규화의 개념

  • 불필요한 데이터 중복이 발생하여 릴레이션에 대한 데이터의 삽입-수정-삭제 연산을 수행할 때 부작용이 발생할 수 있다.
  • 부작용을 이상 현상(anomaly)이라 한다.

9-1-2 이상 현상의 종류

  • 삽입 이상(insertion anomaly), 갱신 이상 (update animal), 삭제 이상(deletion anomaly)
  • 이상 현상의 종류  
    삽입 이상 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제
    갱신 이상 중복 투플 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제
    삭제 이상 투플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제

image-20231117090317403

  • 그림 9-2의 이벤트참여 릴레이션은 한 고객이 여러 이벤트에 참여할 수 있으므로 고객 아이디만으로는 투플을 유일하게 식별할수 없다.
  • 고객아이디와 이벤트번호 속성을 함께 사용하여 이벤트참여 릴레이션의 기본키를 구성한다.
  • apple인 고객은 3개의 이벤트에 참여하므로 고객의 이름과 등급이 이벤트참여 릴레이션에 3번 저장된다.
  • 중복되어 저장되면 릴레이션에 데이터를 삽입-수정-삭제할 때 삽입-갱신-삭제 이상 현상이 발생할 수 있다.

9-1-2-1 삽입 이상 (삽입시, 원치 않는 불필요한 데이터도 함께 삽입)

  • 릴레이션에 새 데이터를 삽입하기 위해 원치 않는 불필요한 데이터도 함께 삽입해야 하는 문제를 삽입 이상(insertion anomaly라고 한다.
  • 이 고객이 참여한 이벤트가 아직 없다면 이벤트참여 릴레이션에 이 고객에 대한 데이터를 삽입할 수 없다.
  • 즉, 고객아이디와 참여한 이벤트번호가 모두 존재해야 이벤트참여 릴레이션에 새 고객의 데이터를 삽입할 수 있다.
  • 참여하지 않은 임시 이벤트번호를 삽입해야 하므로 이벤트참여 릴레이션에는 삽입 이상이 발생하게 된다.
  • 삽입을 위해 원치 않는 데이터를 삽입해야 한다.

![image-20231117090846652](/Users/seungchan/Library/Application Support/typora-user-images/image-20231117090846652.png)

9-1-2-2 갱신 이상 (일부만 수정 -> 데이터 불일치 발생)

  • 릴레이션의 중복된 투플들 중 일부만 수정하여 데이터가 불일치하게 되는 모순이 발생하는 것을 갱신 이상(update anomaly)이라 한다.
  • 아이디가 apple인 고객의 등급이 gold에서 vip로 변경된다면,
  • 이벤트참여 릴레이션에서 apple 고객에 대한 투플 3개의 등급 속성 값이 모두 수정되어야한다.
  • 그렇지 않고 2개의 투플만 등급이 수정된다면 apple 고객이 서로 다른 등급을 가지는 모순이 생겨 갱신 이상이 발생한다.

![image-20231117091139492](/Users/seungchan/Library/Application Support/typora-user-images/image-20231117091139492.png)

9-1-2-3 삭제이상

  • 릴레이션에서 투플을 삭제하면 꼭 필요한 데이터까지 함께 삭제하여 데이터가 손실되는 연쇄삭제 현상을 삭제 이상(deletion anomaly) 라한다
  • orange인 고객이 이벤트 참여를 취소하여 이벤트참여 릴레이션에서 관련된 투플을 삭제해야 한다.
  • 그림의 투플이 삭제되면 이벤트 참여와 관련이 없음에도 불구하고 해당 고객에 대한
  • 고객아이디-고객이름-등급 데이터까지 원치 않게 손실되는 삭제 이상이 발생
  • 원치 않는 데이터 삭제된다.

image-20231117091457714

9-1-3 정규화의 필요성

  • 즉 관련 없는 속성들을 하나의 릴레이션에 모아두고 있기 때문이다.
  • 이상 현상이 발생하지 않도록 하려면, 관련 있는 속성들로만 릴레이션을 구성해야 하는데
  • 이를 위해 하는 것이 정규화 이다.
  • 릴레이션을 분해 하는 과정 정규화를 통해 릴레이션 설계를 올바르게 완성할 수 있다.
  • 속성들 간의 관련성을 함수적 종속성(FD: functional Dependency) 라고한다.
  • 일반적으로 릴레이션에 함수적 종속성이 하나 존재하도록 정규화를 통해 릴레이션을 분해
  • 이상현상이 발생하는 이유 -> 관련 없는 속성들을 하나의 릴레이션에 모아두었기 때문
  • 함수적 종속성 하나 존재 하도록 정규화 => 릴레이션 분해
NOTE 
함수적 종속성이 정확한 변역이지만, 이와 관련해 추가로 등장하는 용어를 부르기 편하도록 이후 부터는 함수적 종속성 대힌
함수 종속성이라는 용어를 사용하기로 한다.

9-2 함수 종속

  • 릴레이션 내의 모든 투플에서 X 값에 대한 Y값이 항상 하나면 "X가 Y를 함수적으로 결정한다" 또는 "Y가 X에 함수적으로 종속되어 있다"라고 한다.
  • X를 결정자, Y를 종속자 라고한다.

image-20231118223044149

  • X가 Y를 함수적으로 결정한다.
  • Y가 X에 함수적으로 종속되어 있다.

image-20231118223114964

<고객 아이디가 고객이름/등급 을 결정한다.>

  • 고객 아이디(X) 속성 값에 대응되는 고객이름(Y) 속성과 등급 속성(Y)의 값이 단 하나이므로,
  • 고객아이디(X)가 고객이름(Y)과 등급(Y)을 결정한다고 볼 수 있다.
  • 결정자(X) : 고객아이디
    종속자(Y) : 고객이름과 등급
  • 함수 종속 관계는 다음과 같이 기호로 표현가능하다.

image-20231118223154817

  • 함수 종속 다이어그램
  • 복잡한 함수 종속 관계를 더 직관적으로 이해하는 데 도움이 된다.image-20231118223218774
  • 현재 시점에 릴레이션에 포함된 속성 값만으로 판단하면 안 된다는 것이다.
  • 릴레이션에서 속성 값은 계속 변할 수 있기 때문에 속성 자체가 가지고 있는 특성과 의미를 기반으로 판단해야한다.
  • 고객 릴레이션에 현재 저장되어 있는 속성 값이 아닌 속성 자체의 특성을 고려하여 함수 종속 관계를 판단해야 한다.
  • 고객 릴레이션에서 고객아이디는 고객을 구별해주는 기본키 속성이기 때문아이디가 같은 서로 다른 고객이 존재할 수 없다.
  • 그러므로 고객 아이디가 정해지면 오직 하나의 고객이름과 등급이 결정된다.
  • 투플을 유일하게 구별하는 기본키와 후보키는 그 특성 때문에 릴레이션을 구성하는 다른 모든 속성들을 함수적으로 결정한다.
  • 일반 속성또한 결정자가 가능하다.
  • 함수 종속 관계 X->Y에서 기본키나 후보키만 결정자인 X가 될 수 있는 것은 아니다.
  • 일반 속성이 결정자 조건 : 속성 X값이 같으면 이 값과 연관된 속성 Y 값도 모두 같아야 결정자로 인정받을 수 있다.
  • (X는 일반 속성도 가능하다. 하지만 x -> y의 값이 같아야 인정한다)

"함수 종속 관계를 판단"

image-20231118223239039

  • 고객 아이디가 고객이름을 유일하게 결정한다.
  • 고객 아이디가 같으면 모든 투플에서 고객이름이 받드시 같은 값을 가지기 때문이다.
  • 고객이름은 고객아이디에 종속되어 있어,
  • 고객 아이디가 결정자가 되고 고객이름이 종속자가 된다.
  • 기본키인 [고객아이디, 이벤트번호] 속성 집합당첨 여부 속성을 유일하게 결정한다.
  • 당첨여부[고객아이디, 이벤트번호]에 종속되어 있다.
  • [고객아이디, 이벤트번호]가 결정자가 되고 당첨여부가 종속자가 된다.
  • 고객이름도 기본키인 [고객아이디, 이벤트번호]에 종속되어 있다

image-20231118223254748

  • 이벤트참여 릴레이션에 존재하는 함수 종속 관계에서 [고객아이디, 이벤트번호]에 종속되어 있는 고객이름
  • [고객아이디, 이벤트번호]의 일부분인 고객아이디에도 종속되어 있다.
  • 고객이름(Y) 속성[고객 아이디, 이벤트번호](X) 속성 집합에 부분 함수 종속되어있다
  • 당첨여부(Y) 속성[고객아이디, 이벤트번호]의 일부분이 아닌 속성 집합 전체에 종속되어 있다.
  • 당첨여부(Y)이 [고객아이디, 이벤트번호](X) 속성 집합에 완전 함수 종속되었다고 한다.
  • 완전 함수 종속(FFD: Full Functional Dependency)속성 집합 X전체에 종속된 것이지 일부분에 종속된 것이 아님을 의미한다.
  • 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만,
  • 부분 함수 종속(PFD: Partial Functional Dependency)부분 함수 종속 관계가 성립하려면 결정자가 여러 개의 속성들로 구성되어 있어야 한다.그러나 정규화를 수행하는 과정에서 릴레이션이 부분 함수 종속 관계를 포함하고 있는지를 확인하는보통은 완전 함수 종속(FFD) But 정규화 중 부분 함수 종속 확인
  • 경우가 있으므로 부분 함수 종속도 의미를 정확히 이해해둘 필요가 있다.
  • 일반적으로 함수 종속이라고 하면 완전 함수 종속을 의미한다.
  • 속성 집합 Y가 속성 집합 X의 전체가 아닌 일부분에도 함수적으로 종속됨을 의미하므로,

예시)

  • 이벤트 참여 릴레이션에서 고객이름은 고객아이디에 완전 함수 종속되어 있지만
  • 고객이름[고객아이디, 이벤트번호]에는 부분 함수 종속되어 있다.
  • 그리고 당첨여부[고객아이디, 이벤트번호]에 완전 함수 종속되어 있다.

image-20231118223313198


릴레이션에 존재하는 함수 종속 관계에서는 결정자와 종속자가 같거나, 결정자가 종속자를 포함하는 것처럼 당연한 함수 종속 관계는 고려하지 않는다.

image-20231118223327362

9-3 기본 정규형과 정규화 과정

9-3-1 정규화의 개념과 정규형의 종류

  • 함수 종속성을 이용하여 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해해서
  • 이상현상이 발생하지 않는 올바른 릴레이션으로 만들어나가는 과정을 정규화(normalization)라고 한다.
  • 정규화의 기본 목표는 관련이 없는 함수 종속성을 별개의 릴레이션으로 표현하는 것이다.
  • 정규화된 정도는 정규형(NF: Normal From)으로 표현한다.
  • 정규형은 크게 기본 정규형과 고급 정규형으로 나뉜다.
  • 기본 정규형에는 = 제1 정규형, 제2 정규형, 제3 정규형, 보이스/코드 정규형이 있다.
  • 고급 정규형에는 = 제4 정규형, 제5 정규형이 있다.

image-20231118223341282

  • 차수가 높으면 => 제약조건이 많다.
  • 특정 정규형의 제약조건을 만족하면 릴레이션이 해당 정규형에 속한다고 표현한다.
  • 일반적으로 차수가 높은 정규형에 속하는 릴레이션일수록 데이터 중복이 줄어 데이터 중복에 의한
  • 이상 현상이 발생하지 않는 바람직한 릴레이션일 수 있다.
  • 모든 릴레이션이 제5정규형에 속해야 되는 것은 아니므로
  • 릴레이션의 특성을 고려해서 적합한 정규형을 선택해야 한다.

image-20231118223354686

9-3-2 제1 정규형(1NF: First Normal Form)

제1 정규형(1NF)
릴레이션에 속한 모든 속성의 도메인이
원자 값(atomic value)으로만 구성되어 있으면 제 1정규형에 속한다.
  • 릴레이션이 제1 정규형에 속하려면 릴레이션에 속한 모든 속성이 더는 분해되지 않는 원자 값만 가져야 한다.
  • 이벤트참여 릴레이션에서 이벤트번호 속성과 당첨여부 속성은 하나의 고객아이디에 해당하는 값이 여러 개다.
  • 다중 값을 가지는 속성을 포함한 이벤트참여 릴레이션은 제1 정규형의 제약조건을 만족하지 못하므로제1 정규형에 속하지 않는다.
  • 다중 값은 제1 정규형의 제약조건이 아니다.

image-20231118223412701

  • 투플마다 이벤트 번호와 당첨 여부 속성 값을 하나씩만 포함하도록 분해하여
  • 모든 속성이 원자 값을 가지도록 해야한다.

image-20231118223422252

  • 제1 정규형에 속하지만, 불필요한 데이터 중복으로 인해 이상 현상이 발생한다
  • 이벤트참여 릴레이션은 5개의 속성으로 구성되어 있고, [고객아이디, 이벤트번호] 속성집합이 기본키 역할을 담당한다.
  • 고객아이디등급과 할인율을 유일하게 결정한다.
  • 등급에 따라 할인율이 결정되며, [고객아이디, 이벤트번호] 속성 집합이 당첨여부 속성을 유일하게 결정한다.
  • image-20231118223450514
  • 등급과 할인율 속성의 값이 중복되어 나타나는 경우가 많다.
  • 불필요한 데이터가 중복되면 다음과 같은 삽입-갱신-삭제 이상 현상이 발생할 수 있다.

image-20231118223519050

9-3-2-1 삽입이상

  • 이벤트참여 릴레이션의 기본키는 [고객아이디, 이벤트번호]이므로 새 고객에 대한 데이터를 삽입하려면
  • 고객의 이벤트에 무조건 참여해야 한다.
  • 하지만 고객아이디, 등급, 할인율의 데이터만 삽입하려면 => 이벤트번호 속성이 NULL 값이 되므로
  • 개체 무결성 제약조건을 위반하기 때문이다.

image-20231118223531393

9-3-2-2 갱신 이상

  • 만약 이 고객의 등급이 gold에서 vip로 변경되면 세 투플의 등급 속성의 값을 vip로 변경해야 한.
  • 데이터 일관성을 유지할 수 없게 된다.

image-20231118223541037

9-3-2-3 삭제 이상

  • 고객아이디가 orange인 고객에 관련된 투플은 단 하나다.
  • 고객이 E004 이벤트에 참여한 기록을 삭제해달라고 요구하면 이 투플을 삭제해야한다.
  • 그런데 이 투플을 삭제하면 이벤트와 관련이 없는 데이터, 즉 orange 고객의 등급과 할인율 같은 고객 정보도 함께 삭제 되므로
  • 고객과 관련해 꼭 필요한 데이터도 유지할 수 없게 된다.

image-20231118223603700

  • 다양한 이상 현상이 발생하는 이유는
  • 릴레이션이 부분 함수 종속을 포함하고 있기 때문이다.
  • 즉, 기본키인 {고객아이디, 이벤트번호}에 완전 함수 종속되지 못하고 일부분인 고객아이디에 종속되는 등급과 할인율 속성때문이다.
  • 기본키에 완전 함수 종속되지 못한 등급과 할인율 속성의 값이 릴레이션에서 여러번 중복되어 나타나는 것은 물론
  • 관련이 없는 이벤트번호-당첨여부 속성이 하나의 릴레이션에 존재하기 때문에 여러 이상 현상이 발생하고 있다.
  • 이러한 문제를 해결하기 위해서는 부분 함수 종속이 제거되도록 이벤트참여 릴에이션을 분해해야한다.
  • 부분 함수 종속 때문에 중복 발생

image-20231118223621519

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

제2 정규형 (2NF)
릴레이션이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속 되면 제2정규형에 속한다.
  • 제1 정규형에 속하는 릴레이션이 제2정규형을 만족하게 하려면
  • 부분 함수 종속을 제거하고 모든 속성이 기본키에 완전 함수 종속되도록 릴레이션을 분해 하는 정규화 과정을 거쳐야한다.
  • 제 1정규형에 속하지만 기본키인 [고객아이디, 이벤트 번호]완전 함수 종속되지 않는 등급-할인율 속성이 존재하므로 제2정규형에 속하지 않는다.
  • 등급-할인율 속성이 관련 없는 이벤트번호-당첨여부 속성과 같은 릴레이션에 존재하지 않도록
  • 그림 9-24와 같이 2개의 릴레이션으로 분해하면, 분해된 고객 릴레이션과 이벤참여 릴레이션은 모두 제2정규형에 속하게 된다.
  • 릴레이션이 둘로 분해되면서 등급과 할인율 속성에 대한 데이터 중복이 줄어듦을 확인할 수 있다.
  • 릴레이션 분해 과정을 통해 고객 릴레이션에는 기본키인 고객아이디기본키에 완전 함수 종속된 등급-할인율 속성만 존재한다.

image-20231118185744090

  • 정규화 과정에서 릴레이션을 분해할 때 주의 할 점은, 분해된 릴레이션들을 자연 조인하여 분해 전의 릴레이션으로 다시 복원할 수 있어야 한다는 것이다.
  • 의미상 동등한 릴레이션들로 분해되어야 하고
  • 릴레이션을 분해 했을때 정보 손실발생하지 않아야 한다.
  • 자연 조인을 하면 원래의 릴레이션으로 다시 복원할 수 있도록, 저보의 손실 없이 릴레이션을 분해하는 것을 무손실 분해(nonloss decomposition)이라고 한다.

image-20231118190939934

  • 제2 정규형에 속하더라도 릴레이션에 이상 현상이 발생할 수 있다.
  • 이벤트참여 릴레이션은 함수 종속성을 단 하나만 포함하므로 이상 현상이 더는 발생하지 않는다.
  • 고객 릴레이션은 부분 함수 종속은 없지만 함수 종속성을 아직도 여러 개 포함하고 있어 이상 현상이 발생할 수 있다.

image-20231118191228090

9-3-3-1 삽입 이상

image-20231118191328360

  • 할인율이 1%인 bronze라는 등급이 생겼지만
  • 고객 릴레이션의 기본키가 고객아이디이기 때문에 bronze 등급에 속하는 고객이 없으면
  • 기본키가 널 값이 되므로 개체 무결성 제약 조건이 된다.

9-3-3-2 갱신 이상

image-20231118191444130

  • 등급에 관련된 모든 투플에서 할인율 속성 값을 똑같이 변경해야 한다.
  • 같은 등급에 대해 할인율이 여러 개 존재하는 모순이 발생하게 된다.
  • 한 투플만 할인율을 변경하면 데이터 불일치의 문제가 발생한다.

9-3-3-3 삭제 이상

image-20231118191718016

  • 투플이 삭제되면 등급과 할인율에 대한 정보까지 삭제된다.
  • 고객 릴레이션에서 이고객에 대한 투플을 삭제하면 vip 등급의 할인율이 20%라는 정보도 함께 삭제 되기 때문에 vip등급에 관련된 데이터가 사라지게 된다.
  • 함수 종속 관계를 여러 개 포함하고 있어 결과적으로 이행적 함수 종속이 생기기 때문이다.
  • 분해된 릴레이션들은 제3정규형에 속하게 되고 앞서 제시한 이상 현상들이 더는 발생하지 않는다.

image-20231118192018497

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

image-20231118192209625

제3 정규형(3NF)
릴레이션이 제2정규형에 속하고, 기본키가 아닌 모든 속성이 
            '기본키에 이행적 함수 종속이 되지 않으면 제3정규형에 속한다.'
  • 이행적 함수 종속(transitive FD)을 살펴보자.
  • 3개의 속성 집합 X, Y, Z에 대해 함수 종속 관계 X -> Y와 Y -> Z가 존재하면 논리적으로 X -> Z가 성립한다.
  • 함수 종속 관계 제거.
  • 제2 정규형을 만족하더라도 하나의 릴레이션에 함수 종속 관계가 여러 개 존재하고
  • 이행적 함수 종속 관계가 유도되면
  • 릴레이션에서 이행적 함수 종속을 제거해서
  • 모든 속성이 기본키에 이행적 함수 종속이 되지 않도록 릴레이션을 분해하는 정규화 과정을 거쳐야 제3 정규형을 만족할 수 있다.
  • 기본키이므로 등급과 할인율 송성이 고객아이디에 함수적으로 종속된다.
  • 그런데 고객 아이디가 등급을 결정하고 등급이 할인율을 결정하는 함수 종속 관계로 인해
  • 고객아이디가 등급을 토앻 할인율을 결정하는 이행적 함수 종속 관계도 존재한다.
  • 할인율이 기본키인 고객아이디에 함수적으로 종속됨과 동시에 등급을 통해서 고객아이디에 이행적으로 종속된다.
  • 그런데 고객아이디-등급-할인율 속성을 모두 하나의 릴에이션에 모아놓다 보니, 고객아이디가 할인율을 결정하게 되고
  • 이로 인해 이상 현상이 발생하게 된 것이다.
  • 이행적 함수 종속이 나타나지 않게 2개의 릴에이션으로 분해해야 된다.
  • 즉, X와 Y속성 집합의 릴레이션과 Y와 Z속성 집합의 릴레이션으로 분해한다.
  • 분해된 고객 릴레이션은 고객아이디 -> 등급, 등급 -> 할인율의 함수 종속 관계를 유지할 수 있도록
  • 2개의 릴레이션으로 분해하면 된다.
  • 새로 분해된 고객 릴레이션과 고객등급 릴레이션은 모두 제 3정규형에 속하게 된다.
  • 릴레이션을 분해하면 하나의 릴레이션에 하나의 관계만 존재하게 되어 이행적 함수 종속으로 인한 이상 현상이 발생하지 않게 된다.
  • 고객 릴레이션은 기본키인 고객아이디가 등급을 직접 결정하므로 제3정규형에 속한다.
  • 마찬가지로 고객등급 릴레이션도 기본키인 등급이 할인율을 직접 결정하므로 제 3정규형에 속한다.

image-20231118193626209image-20231118193648744

9-3-5 보이스/코드 정규형(BCNF: Bouce/Codd Normal Form)

보이스/코드 정규형(BCNF)
릴레이션의 함수 종속 관계에서 
        "모든 결정자가 후보키이면 보이스/코드 정규형에 속한다." => 후보키: 유일성+최소성
  • 후보키 속성이 하나밖에 없어 이를 기본키로 선정한 경우다.
  • 릴레이션에 발생할 수 있는 이상 현상을 해결하기 위해 제3정규형보다 좀 더 엄격한 제약조건을 제시하는 것이 보이스/코드 정규형이다.
  • 보이스/코드 정규형을 강한 제3정규형(strong 3NF)라고 한다.
  • 그 이유는 보이스/코드 정규형에 속하는 모든 릴레이션은 제3정규형에 속하지만.
  • 제3 정규형에 속하는 릴레이션이라고 해서 다 보이스/코드 정규형에 속하는 것은 아니기 때문에
  • 보이스/코드 정규형을 강한 제3정규형(strong 3NF)라고 한다.
  • 그 이유는 보이스/코드 정규형에 속하는 모든 릴레이션은 제3정규형에 속하지만.
  • 제3정규형에 속하는 릴레이션이라고 해서 다 보이스/코드 정규형에 속하는 것은 아니기 때문이다.
  • **[고객아이디, 이벤트번호] => 당첨여부의 함수 종속 관계를 포함하고 있는 **
  • 분해된 이벤트참여 릴레이션[고객아이디, 이벤트번호]가 유일한 후보키이자 기본키이면서 함수 종속 관계에서도 유일한 결정자다.
  • 그머므로 제3정규형에 속하는 이벤트참여 릴레이션은 보이스/코드 정규형에도 속한다.
  • 고객아이디-> 등급의 함수 종속 관계를 포함하고 있는 분해된 고객 릴레이션도 제3정규형에 속하면서 기본키인 고객아이디가 함수 종속 관계에서 유일한 결정자이므로 보이스/코드 정규형에 속한다.
  • 등급->할인율의 함수 종속 관계를 포함하고 있는 고객등급 릴레이션도 제3정규형에 속하면서
  • 기본키인 등급이 함수 종속 관계에서 유일한 결정자므로 보이스/코드 정규형에 속한다.
  • 강좌신청 릴레이션에서는 한 고객이 인터넷 강좌를 여러개 신청할 수 있지만 동일한 인터넷강좌를 여러 번 신청할 수는 없다.
  • 강사 한 명이 인터넷강좌를 하나만 담당할 수 있고, 하나의 인터넷강좌는 여러 강사가 담당할 수 있다.
  • 투플을 구별할 수 있는 후보키로는 [고객아이디, 인터넷강좌]와 [고객아이디, 담당강사번호]가 있고, 이중에서 [고객아이디, 인터넷강좌]를 기본키로 선정

image-20231118204942547

  • 기본키인 [고객아이디, 인터넷강좌]가 담당강사번호속성을 함수적으로 결정하는 것은 당연하다.
  • 담당강사번호가 인터넷 강좌를 함수적으로 결정한다고 볼 수 있다.

image-20231118205103929

  • 기본키가 아닌 속성인 담당강사번호가 기본키에 완전 함수 종속되는 것은 물론
  • 이행적 함수 종속을 포함하고 있지 않으므로 제2 정규형과 제3정규형에도 속한다.
  • 담당강사번호 속성이 후보키가 아님에도 인터넷강좌 속성을 결정하므로 강좌 신청 릴레이션은 보이스/코드 정규형에는 속하지 않는다.
  • 보이스/코드 정규형에 속하지 않는 강좌신청 릴레이션은 다음과 같은 삽입-갱신-삭제 이상 현상이 발생할 수 있다.
  • 이상 현상이 발생하는 이유와 함께 하나씩 살펴보자.
  • 담당강사 번호 -> 인터넷 강좌

9-3-5-1 보이스/코드 삽입 이상

  • P005 강사가 중급토익 강좌를 담당하게 되었지만
  • 강좌신청 릴레이션의 기본키가 [고객아이디, 인터넷강좌]이므로 고객아이디 속성이 널 값을 가질수 없기 때문이다.

image-20231118213856785

9-3-5-2 보이스/코드 갱신 이상

  • P004 강사가 담당하는 인터넷강좌가 중급토익으로 변경되면 P004 강사와 관련된 2개의 투플에서 인터넷강좌 속성의 값을 모두 중급토익으로 동일하게 변경해야 한다.
  • 강사 한 명이 인터넷 강좌를 하나만 담당해야 한다는 전체 조건에 모순되는 문제가 발생한다.

image-20231118214016780

9-3-5-3 보이스/코드 삭제 이상

  • Banana인 고객이 인터넷강좌 신청을 취소해서 해당 고객에 대한 투플을 삭제하면,
  • P002 강사에 대한 정보를 담고 있는 유일한 투플이므로 삭제하면 강좌 신청 릴레이션에 P002 강사에 대한 데이터를 더는 유지할 수 없게 된다.

![image-20231118214057553](/Users/seungchan/Library/Application Support/typora-user-images/image-20231118214057553.png)

  • 후보키가 아니면서 함수 종속 관계에서 다른 속성을 결정하는 담당강사번호 속성이 존재하기 때문이다.
  • 모든 결정자가 후보키가 될 수 있도록 강좌신청 릴레이션을 2개의 릴레이션으로 분해 해야한다.

image-20231118214449853

  • 고객 담당강사 릴레이션은 함수 종속 관계가 성립하지 않는 동등한 고객아이디- 담당강사번호 속성으로 구성하고,
  • [고객아이디, 담당강사번호]가 기본키의 역할을 담당한다.
  • 그러므로 후보키가 아닌 결정자가 존재하지 않아 보이스/코드 정규형에 속한다.
  • 강좌담당 릴레이션은 담당강사 번호 -> 인터넷강좌의 함수 종속 관계를 포함하고 있고 담당 강사 번호가 유일한 후보키이자 기본키다.
  • 후보키가 아닌 결정자가 존재하지 않아 보이스/코드 정규형에 속한다.

![image-20231118214711594](/Users/seungchan/Library/Application Support/typora-user-images/image-20231118214711594.png)

  • 고객담당강사 릴레이션과 강좌좌담당 릴레이션의 함수 종속 다이어그램

![image-20231118215237435](/Users/seungchan/Library/Application Support/typora-user-images/image-20231118215237435.png)

9-3-6 제4정규형과 제5정규형

  • 고급 정규형으로 분류되는 제4정규형은 릴레이션이 보이스/코드 정규형을 만족하면서, 함수종속이 아닌 다치 종속(MVD: Multi Valued Dependency)
  • 제5정규형은 릴레이션이 제4정규형을 만족하면서 후보키를 통하지 않는 조인 종속(JD: Join Dependency)을 제거해야 만족

9-3-7 정규화 과정

  1. 제1정규형 : 릴레이션을 분해하여 모든 속성의 도메인이 원자 값으로만 구성되도록 하면 제1정규형
  2. 제2정규형 : 제1정규형에 속하는 릴레이션에서 부분 함수 종속을 제거하여 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제2정규형이다.
  3. 제3정규형 : 제2정규형 릴레이션에서 이행적 함수 종속을 제거하면 제3 정규형이 된다.
  4. 보이스/코드 정규형 : 제3정규형 릴레이션에서 후보키가 아닌 결정자를 제거하면 보이스/코드 정규형이 된다.

image-20231118220249698

9-4 요약

9-4-1 이상 현상의 개념

  • 불필요한 데이터 중복으로 인해 발생하는 부작용들이다.
  • 함수 종속 관계 여러 개를 하나의 릴레이션에 표현하는 경우에 주로 발생

9-4-2 이상 현상의 종류

  • 삽입 이상 : 새터이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제다.
  • 갱신 이상 : 중복된 투플 중 일부 투플만 변경하여 데이터가 불일치하게 되는 모순의 문제다.
  • 삭제 이상 : 투플 삭제 시 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제다.

9-4-3 함수 종속

  • 어느 시점에서든 릴레이션 내의 모든 투플에서 속성 집합 X 값에 대한 속성 집합 Y 값이 항상 하나면
  • Y가 X에 함수적으로 종속 되어 있다 라고 한다.

9-4-4 함수 종속 다이어그램

  • 릴레이션 하나를 구성하는 속성들 간의 함수 종속 관계를 도식화하여 표현한 것이다.

9-4-5 정규화 (분해)

  • 함수 종속성을 이용 하여, 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해이상현상이 발생하지 않는 바람직한 릴레이션으로 만들어나가는 과정이다.

9-4-6 정규형

  • 릴레이션이 정규화된 정도를 나타내는 기준이다.
  • 다음과 같은 네 가지 기본 정규형을 주로 사용한다.
  1. 제1 정규형: 릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어 있다.
  2. 제2 정규형 : 릴레이션이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속 되어있다.
  3. 제3 정규형 : 릴레이션이 제2정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적으로 함수 종속되지 않았다.
  4. 보이스/코드 정규형 : 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키다.

9-5 연습문제