09장 정규화
9-1 정규화의 개념과 이상 현상
9-2 함수 종속
9-3 기본 정규형과 정규화 과정
9-4 요약
9-5 연습문제
- 데이터 베이스가 싫어 하는 중복이 많이 나타나고
- 이미 설계한 릴레이션에 이상한 문제가 발생하지 않게 하려면
- 싫어하는 동물과 같이 안 살면 되는 것처럼, 하나의 릴레이션에 관련 없는 속성이 들어가지 않게 하고
- 친한 속성끼리 릴레이션을 구성
- 이 기준에 따라 릴레이션을 구성하는 방법인 정규화를 소개하고자 한다.
- 필요한 함수 종속성의 개념을 이해하고 실제 예를 통해 정규화 과정을 연습해볼 수 있다.
9-1 정규화의 개념과 이상 현상
9-1-1 정규화의 개념
- 불필요한 데이터 중복이 발생하여 릴레이션에 대한 데이터의 삽입-수정-삭제 연산을 수행할 때 부작용이 발생할 수 있다.
- 부작용을 이상 현상(anomaly)이라 한다.
9-1-2 이상 현상의 종류
- 삽입 이상(insertion anomaly), 갱신 이상 (update animal), 삭제 이상(deletion anomaly)
-
이상 현상의 종류 삽입 이상 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제 갱신 이상 중복 투플 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제 삭제 이상 투플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제
- 그림 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인 고객이 이벤트 참여를 취소하여 이벤트참여 릴레이션에서 관련된 투플을 삭제해야 한다.
- 그림의 투플이 삭제되면 이벤트 참여와 관련이 없음에도 불구하고 해당 고객에 대한
- 고객아이디-고객이름-등급 데이터까지 원치 않게 손실되는 삭제 이상이 발생
- 원치 않는 데이터 삭제된다.
9-1-3 정규화의 필요성
- 즉 관련 없는 속성들을 하나의 릴레이션에 모아두고 있기 때문이다.
- 이상 현상이 발생하지 않도록 하려면, 관련 있는 속성들로만 릴레이션을 구성해야 하는데
- 이를 위해 하는 것이 정규화 이다.
- 릴레이션을 분해 하는 과정 정규화를 통해 릴레이션 설계를 올바르게 완성할 수 있다.
- 속성들 간의 관련성을 함수적 종속성(FD: functional Dependency) 라고한다.
- 일반적으로 릴레이션에 함수적 종속성이 하나 존재하도록 정규화를 통해 릴레이션을 분해
- 이상현상이 발생하는 이유 -> 관련 없는 속성들을 하나의 릴레이션에 모아두었기 때문
- 함수적 종속성 하나 존재 하도록 정규화 => 릴레이션 분해
NOTE
함수적 종속성이 정확한 변역이지만, 이와 관련해 추가로 등장하는 용어를 부르기 편하도록 이후 부터는 함수적 종속성 대힌
함수 종속성이라는 용어를 사용하기로 한다.
9-2 함수 종속
- 릴레이션 내의 모든 투플에서 X 값에 대한 Y값이 항상 하나면 "X가 Y를 함수적으로 결정한다" 또는 "Y가 X에 함수적으로 종속되어 있다"라고 한다.
- X를 결정자, Y를 종속자 라고한다.
- X가 Y를 함수적으로 결정한다.
- Y가 X에 함수적으로 종속되어 있다.
<고객 아이디가 고객이름/등급 을 결정한다.>
- 고객 아이디(X) 속성 값에 대응되는 고객이름(Y) 속성과 등급 속성(Y)의 값이 단 하나이므로,
- 고객아이디(X)가 고객이름(Y)과 등급(Y)을 결정한다고 볼 수 있다.
-
결정자(X) : 고객아이디 종속자(Y) : 고객이름과 등급
- 함수 종속 관계는 다음과 같이 기호로 표현가능하다.
- 함수 종속 다이어그램
- 복잡한 함수 종속 관계를 더 직관적으로 이해하는 데 도움이 된다.
- 현재 시점에 릴레이션에 포함된 속성 값만으로 판단하면 안 된다는 것이다.
- 릴레이션에서 속성 값은 계속 변할 수 있기 때문에 속성 자체가 가지고 있는 특성과 의미를 기반으로 판단해야한다.
- 고객 릴레이션에 현재 저장되어 있는 속성 값이 아닌 속성 자체의 특성을 고려하여 함수 종속 관계를 판단해야 한다.
- 고객 릴레이션에서 고객아이디는 고객을 구별해주는 기본키 속성이기 때문에 아이디가 같은 서로 다른 고객이 존재할 수 없다.
- 그러므로 고객 아이디가 정해지면 오직 하나의 고객이름과 등급이 결정된다.
- 투플을 유일하게 구별하는 기본키와 후보키는 그 특성 때문에 릴레이션을 구성하는 다른 모든 속성들을 함수적으로 결정한다.
- 일반 속성또한 결정자가 가능하다.
- 함수 종속 관계 X->Y에서 기본키나 후보키만 결정자인 X가 될 수 있는 것은 아니다.
- 일반 속성이 결정자 조건 : 속성 X값이 같으면 이 값과 연관된 속성 Y 값도 모두 같아야 결정자로 인정받을 수 있다.
- (X는 일반 속성도 가능하다. 하지만 x -> y의 값이 같아야 인정한다)
"함수 종속 관계를 판단"
- 고객 아이디가 고객이름을 유일하게 결정한다.
- 고객 아이디가 같으면 모든 투플에서 고객이름이 받드시 같은 값을 가지기 때문이다.
- 고객이름은 고객아이디에 종속되어 있어,
- 고객 아이디가 결정자가 되고 고객이름이 종속자가 된다.
- 기본키인 [고객아이디, 이벤트번호] 속성 집합은 당첨 여부 속성을 유일하게 결정한다.
- 당첨여부는 [고객아이디, 이벤트번호]에 종속되어 있다.
- [고객아이디, 이벤트번호]가 결정자가 되고 당첨여부가 종속자가 된다.
- 고객이름도 기본키인 [고객아이디, 이벤트번호]에 종속되어 있다
- 이벤트참여 릴레이션에 존재하는 함수 종속 관계에서 [고객아이디, 이벤트번호]에 종속되어 있는 고객이름은
- [고객아이디, 이벤트번호]의 일부분인 고객아이디에도 종속되어 있다.
- 고객이름(Y) 속성이 [고객 아이디, 이벤트번호](X) 속성 집합에 부분 함수 종속되어있다
- 당첨여부(Y) 속성은 [고객아이디, 이벤트번호]의 일부분이 아닌 속성 집합 전체에 종속되어 있다.
- 당첨여부(Y)이 [고객아이디, 이벤트번호](X) 속성 집합에 완전 함수 종속되었다고 한다.
- 완전 함수 종속(FFD: Full Functional Dependency)속성 집합 X전체에 종속된 것이지 일부분에 종속된 것이 아님을 의미한다.
- 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만,
- 부분 함수 종속(PFD: Partial Functional Dependency)부분 함수 종속 관계가 성립하려면 결정자가 여러 개의 속성들로 구성되어 있어야 한다.그러나 정규화를 수행하는 과정에서 릴레이션이 부분 함수 종속 관계를 포함하고 있는지를 확인하는보통은 완전 함수 종속(FFD) But 정규화 중 부분 함수 종속 확인
- 경우가 있으므로 부분 함수 종속도 의미를 정확히 이해해둘 필요가 있다.
- 일반적으로 함수 종속이라고 하면 완전 함수 종속을 의미한다.
- 속성 집합 Y가 속성 집합 X의 전체가 아닌 일부분에도 함수적으로 종속됨을 의미하므로,
예시)
- 이벤트 참여 릴레이션에서 고객이름은 고객아이디에 완전 함수 종속되어 있지만
- 고객이름은 [고객아이디, 이벤트번호]에는 부분 함수 종속되어 있다.
- 그리고 당첨여부는 [고객아이디, 이벤트번호]에 완전 함수 종속되어 있다.
릴레이션에 존재하는 함수 종속 관계에서는 결정자와 종속자가 같거나, 결정자가 종속자를 포함하는 것처럼 당연한 함수 종속 관계는 고려하지 않는다.
9-3 기본 정규형과 정규화 과정
9-3-1 정규화의 개념과 정규형의 종류
- 함수 종속성을 이용하여 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해해서
- 이상현상이 발생하지 않는 올바른 릴레이션으로 만들어나가는 과정을 정규화(normalization)라고 한다.
- 정규화의 기본 목표는 관련이 없는 함수 종속성을 별개의 릴레이션으로 표현하는 것이다.
- 정규화된 정도는 정규형(NF: Normal From)으로 표현한다.
- 정규형은 크게 기본 정규형과 고급 정규형으로 나뉜다.
- 기본 정규형에는 = 제1 정규형, 제2 정규형, 제3 정규형, 보이스/코드 정규형이 있다.
- 고급 정규형에는 = 제4 정규형, 제5 정규형이 있다.
- 차수가 높으면 => 제약조건이 많다.
- 특정 정규형의 제약조건을 만족하면 릴레이션이 해당 정규형에 속한다고 표현한다.
- 일반적으로 차수가 높은 정규형에 속하는 릴레이션일수록 데이터 중복이 줄어 데이터 중복에 의한
- 이상 현상이 발생하지 않는 바람직한 릴레이션일 수 있다.
- 모든 릴레이션이 제5정규형에 속해야 되는 것은 아니므로
- 릴레이션의 특성을 고려해서 적합한 정규형을 선택해야 한다.
9-3-2 제1 정규형(1NF: First Normal Form)
제1 정규형(1NF)
릴레이션에 속한 모든 속성의 도메인이
원자 값(atomic value)으로만 구성되어 있으면 제 1정규형에 속한다.
- 릴레이션이 제1 정규형에 속하려면 릴레이션에 속한 모든 속성이 더는 분해되지 않는 원자 값만 가져야 한다.
- 이벤트참여 릴레이션에서 이벤트번호 속성과 당첨여부 속성은 하나의 고객아이디에 해당하는 값이 여러 개다.
- 다중 값을 가지는 속성을 포함한 이벤트참여 릴레이션은 제1 정규형의 제약조건을 만족하지 못하므로제1 정규형에 속하지 않는다.
- 다중 값은 제1 정규형의 제약조건이 아니다.
- 투플마다 이벤트 번호와 당첨 여부 속성 값을 하나씩만 포함하도록 분해하여
- 모든 속성이 원자 값을 가지도록 해야한다.
- 제1 정규형에 속하지만, 불필요한 데이터 중복으로 인해 이상 현상이 발생한다
- 이벤트참여 릴레이션은 5개의 속성으로 구성되어 있고, [고객아이디, 이벤트번호] 속성집합이 기본키 역할을 담당한다.
- 고객아이디가 등급과 할인율을 유일하게 결정한다.
- 등급에 따라 할인율이 결정되며, [고객아이디, 이벤트번호] 속성 집합이 당첨여부 속성을 유일하게 결정한다.
- 등급과 할인율 속성의 값이 중복되어 나타나는 경우가 많다.
- 불필요한 데이터가 중복되면 다음과 같은 삽입-갱신-삭제 이상 현상이 발생할 수 있다.
9-3-2-1 삽입이상
- 이벤트참여 릴레이션의 기본키는 [고객아이디, 이벤트번호]이므로 새 고객에 대한 데이터를 삽입하려면
- 그 고객의 이벤트에 무조건 참여해야 한다.
- 하지만 고객아이디, 등급, 할인율의 데이터만 삽입하려면 => 이벤트번호 속성이 NULL 값이 되므로
- 개체 무결성 제약조건을 위반하기 때문이다.
9-3-2-2 갱신 이상
- 만약 이 고객의 등급이 gold에서 vip로 변경되면 세 투플의 등급 속성의 값을 vip로 변경해야 한.
- 데이터 일관성을 유지할 수 없게 된다.
9-3-2-3 삭제 이상
- 고객아이디가 orange인 고객에 관련된 투플은 단 하나다.
- 고객이 E004 이벤트에 참여한 기록을 삭제해달라고 요구하면 이 투플을 삭제해야한다.
- 그런데 이 투플을 삭제하면 이벤트와 관련이 없는 데이터, 즉 orange 고객의 등급과 할인율 같은 고객 정보도 함께 삭제 되므로
- 고객과 관련해 꼭 필요한 데이터도 유지할 수 없게 된다.
- 다양한 이상 현상이 발생하는 이유는
- 이 릴레이션이 부분 함수 종속을 포함하고 있기 때문이다.
- 즉, 기본키인 {고객아이디, 이벤트번호}에 완전 함수 종속되지 못하고 일부분인 고객아이디에 종속되는 등급과 할인율 속성때문이다.
- 기본키에 완전 함수 종속되지 못한 등급과 할인율 속성의 값이 릴레이션에서 여러번 중복되어 나타나는 것은 물론
- 관련이 없는 이벤트번호-당첨여부 속성이 하나의 릴레이션에 존재하기 때문에 여러 이상 현상이 발생하고 있다.
- 이러한 문제를 해결하기 위해서는 부분 함수 종속이 제거되도록 이벤트참여 릴에이션을 분해해야한다.
- 부분 함수 종속 때문에 중복 발생
9-3-3 제2정규형(2NF: Second Normal Form)
제2 정규형 (2NF)
릴레이션이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속 되면 제2정규형에 속한다.
- 제1 정규형에 속하는 릴레이션이 제2정규형을 만족하게 하려면
- 부분 함수 종속을 제거하고 모든 속성이 기본키에 완전 함수 종속되도록 릴레이션을 분해 하는 정규화 과정을 거쳐야한다.
- 제 1정규형에 속하지만 기본키인 [고객아이디, 이벤트 번호]에 완전 함수 종속되지 않는 등급-할인율 속성이 존재하므로 제2정규형에 속하지 않는다.
- 등급-할인율 속성이 관련 없는 이벤트번호-당첨여부 속성과 같은 릴레이션에 존재하지 않도록
- 그림 9-24와 같이 2개의 릴레이션으로 분해하면, 분해된 고객 릴레이션과 이벤참여 릴레이션은 모두 제2정규형에 속하게 된다.
- 릴레이션이 둘로 분해되면서 등급과 할인율 속성에 대한 데이터 중복이 줄어듦을 확인할 수 있다.
- 릴레이션 분해 과정을 통해 고객 릴레이션에는 기본키인 고객아이디와 기본키에 완전 함수 종속된 등급-할인율 속성만 존재한다.
- 정규화 과정에서 릴레이션을 분해할 때 주의 할 점은, 분해된 릴레이션들을 자연 조인하여 분해 전의 릴레이션으로 다시 복원할 수 있어야 한다는 것이다.
- 의미상 동등한 릴레이션들로 분해되어야 하고
- 릴레이션을 분해 했을때 정보 손실이 발생하지 않아야 한다.
- 자연 조인을 하면 원래의 릴레이션으로 다시 복원할 수 있도록, 저보의 손실 없이 릴레이션을 분해하는 것을 무손실 분해(nonloss decomposition)이라고 한다.
- 제2 정규형에 속하더라도 릴레이션에 이상 현상이 발생할 수 있다.
- 이벤트참여 릴레이션은 함수 종속성을 단 하나만 포함하므로 이상 현상이 더는 발생하지 않는다.
- 고객 릴레이션은 부분 함수 종속은 없지만 함수 종속성을 아직도 여러 개 포함하고 있어 이상 현상이 발생할 수 있다.
9-3-3-1 삽입 이상
- 할인율이 1%인 bronze라는 등급이 생겼지만
- 고객 릴레이션의 기본키가 고객아이디이기 때문에 bronze 등급에 속하는 고객이 없으면
- 기본키가 널 값이 되므로 개체 무결성 제약 조건이 된다.
9-3-3-2 갱신 이상
- 등급에 관련된 모든 투플에서 할인율 속성 값을 똑같이 변경해야 한다.
- 같은 등급에 대해 할인율이 여러 개 존재하는 모순이 발생하게 된다.
- 한 투플만 할인율을 변경하면 데이터 불일치의 문제가 발생한다.
9-3-3-3 삭제 이상
- 투플이 삭제되면 등급과 할인율에 대한 정보까지 삭제된다.
- 고객 릴레이션에서 이고객에 대한 투플을 삭제하면 vip 등급의 할인율이 20%라는 정보도 함께 삭제 되기 때문에 vip등급에 관련된 데이터가 사라지게 된다.
- 함수 종속 관계를 여러 개 포함하고 있어 결과적으로 이행적 함수 종속이 생기기 때문이다.
- 분해된 릴레이션들은 제3정규형에 속하게 되고 앞서 제시한 이상 현상들이 더는 발생하지 않는다.
9-3-4 제3정규형(3NF: Third Normal Form)
제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정규형에 속한다.
9-3-5 보이스/코드 정규형(BCNF: Bouce/Codd Normal Form)
보이스/코드 정규형(BCNF)
릴레이션의 함수 종속 관계에서
"모든 결정자가 후보키이면 보이스/코드 정규형에 속한다." => 후보키: 유일성+최소성
- 후보키 속성이 하나밖에 없어 이를 기본키로 선정한 경우다.
- 릴레이션에 발생할 수 있는 이상 현상을 해결하기 위해 제3정규형보다 좀 더 엄격한 제약조건을 제시하는 것이 보이스/코드 정규형이다.
- 보이스/코드 정규형을 강한 제3정규형(strong 3NF)라고 한다.
- 그 이유는 보이스/코드 정규형에 속하는 모든 릴레이션은 제3정규형에 속하지만.
- 제3 정규형에 속하는 릴레이션이라고 해서 다 보이스/코드 정규형에 속하는 것은 아니기 때문에
- 보이스/코드 정규형을 강한 제3정규형(strong 3NF)라고 한다.
- 그 이유는 보이스/코드 정규형에 속하는 모든 릴레이션은 제3정규형에 속하지만.
- 제3정규형에 속하는 릴레이션이라고 해서 다 보이스/코드 정규형에 속하는 것은 아니기 때문이다.
- **[고객아이디, 이벤트번호] => 당첨여부의 함수 종속 관계를 포함하고 있는 **
- 분해된 이벤트참여 릴레이션은 [고객아이디, 이벤트번호]가 유일한 후보키이자 기본키이면서 함수 종속 관계에서도 유일한 결정자다.
- 그머므로 제3정규형에 속하는 이벤트참여 릴레이션은 보이스/코드 정규형에도 속한다.
- 고객아이디-> 등급의 함수 종속 관계를 포함하고 있는 분해된 고객 릴레이션도 제3정규형에 속하면서 기본키인 고객아이디가 함수 종속 관계에서 유일한 결정자이므로 보이스/코드 정규형에 속한다.
- 등급->할인율의 함수 종속 관계를 포함하고 있는 고객등급 릴레이션도 제3정규형에 속하면서
- 기본키인 등급이 함수 종속 관계에서 유일한 결정자므로 보이스/코드 정규형에 속한다.
- 강좌신청 릴레이션에서는 한 고객이 인터넷 강좌를 여러개 신청할 수 있지만 동일한 인터넷강좌를 여러 번 신청할 수는 없다.
- 강사 한 명이 인터넷강좌를 하나만 담당할 수 있고, 하나의 인터넷강좌는 여러 강사가 담당할 수 있다.
- 투플을 구별할 수 있는 후보키로는 [고객아이디, 인터넷강좌]와 [고객아이디, 담당강사번호]가 있고, 이중에서 [고객아이디, 인터넷강좌]를 기본키로 선정
- 기본키인 [고객아이디, 인터넷강좌]가 담당강사번호속성을 함수적으로 결정하는 것은 당연하다.
- 담당강사번호가 인터넷 강좌를 함수적으로 결정한다고 볼 수 있다.
- 기본키가 아닌 속성인 담당강사번호가 기본키에 완전 함수 종속되는 것은 물론
- 이행적 함수 종속을 포함하고 있지 않으므로 제2 정규형과 제3정규형에도 속한다.
- 담당강사번호 속성이 후보키가 아님에도 인터넷강좌 속성을 결정하므로 강좌 신청 릴레이션은 보이스/코드 정규형에는 속하지 않는다.
- 보이스/코드 정규형에 속하지 않는 강좌신청 릴레이션은 다음과 같은 삽입-갱신-삭제 이상 현상이 발생할 수 있다.
- 이상 현상이 발생하는 이유와 함께 하나씩 살펴보자.
- 담당강사 번호 -> 인터넷 강좌
9-3-5-1 보이스/코드 삽입 이상
- P005 강사가 중급토익 강좌를 담당하게 되었지만
- 강좌신청 릴레이션의 기본키가 [고객아이디, 인터넷강좌]이므로 고객아이디 속성이 널 값을 가질수 없기 때문이다.
9-3-5-2 보이스/코드 갱신 이상
- P004 강사가 담당하는 인터넷강좌가 중급토익으로 변경되면 P004 강사와 관련된 2개의 투플에서 인터넷강좌 속성의 값을 모두 중급토익으로 동일하게 변경해야 한다.
- 강사 한 명이 인터넷 강좌를 하나만 담당해야 한다는 전체 조건에 모순되는 문제가 발생한다.
9-3-5-3 보이스/코드 삭제 이상
- Banana인 고객이 인터넷강좌 신청을 취소해서 해당 고객에 대한 투플을 삭제하면,
- P002 강사에 대한 정보를 담고 있는 유일한 투플이므로 삭제하면 강좌 신청 릴레이션에 P002 강사에 대한 데이터를 더는 유지할 수 없게 된다.
![image-20231118214057553](/Users/seungchan/Library/Application Support/typora-user-images/image-20231118214057553.png)
- 후보키가 아니면서 함수 종속 관계에서 다른 속성을 결정하는 담당강사번호 속성이 존재하기 때문이다.
- 모든 결정자가 후보키가 될 수 있도록 강좌신청 릴레이션을 2개의 릴레이션으로 분해 해야한다.
- 고객 담당강사 릴레이션은 함수 종속 관계가 성립하지 않는 동등한 고객아이디- 담당강사번호 속성으로 구성하고,
- [고객아이디, 담당강사번호]가 기본키의 역할을 담당한다.
- 그러므로 후보키가 아닌 결정자가 존재하지 않아 보이스/코드 정규형에 속한다.
- 강좌담당 릴레이션은 담당강사 번호 -> 인터넷강좌의 함수 종속 관계를 포함하고 있고 담당 강사 번호가 유일한 후보키이자 기본키다.
- 후보키가 아닌 결정자가 존재하지 않아 보이스/코드 정규형에 속한다.
![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정규형
- 제2정규형 : 제1정규형에 속하는 릴레이션에서 부분 함수 종속을 제거하여 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제2정규형이다.
- 제3정규형 : 제2정규형 릴레이션에서 이행적 함수 종속을 제거하면 제3 정규형이 된다.
- 보이스/코드 정규형 : 제3정규형 릴레이션에서 후보키가 아닌 결정자를 제거하면 보이스/코드 정규형이 된다.
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 정규형: 릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어 있다.
- 제2 정규형 : 릴레이션이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속 되어있다.
- 제3 정규형 : 릴레이션이 제2정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적으로 함수 종속되지 않았다.
- 보이스/코드 정규형 : 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키다.
9-5 연습문제
'학교 전공 > 데이터베이스' 카테고리의 다른 글
데이터베이스 개론(3판) - 12장 데이터베이스 응용 기술 (2) | 2023.12.07 |
---|---|
데이터베이스 개론(3판) - 11장 보안과 권한 관리 (1) | 2023.12.06 |
데이터베이스 개론(3판) - 10장 회복과 병행 제어 (1) | 2023.11.28 |
연습문제 - 데이터베이스 개론(3판) - 4장 데이터 모델링 (0) | 2023.10.23 |
연습문제 - 데이터베이스 개론(3판) - 3장 데이터베이스 시스템 (0) | 2023.10.23 |