advisor 가 후보키면 update anmaly 가 발생하지 않을 것이다. (중복이 없으므로)
takecourse relation 을 보자.
기본키의 후보키를 적어보자.
{sno, cname} 이 기본키인 경우
{sno, cname} > prof
prof > cname
{sno, prof} 가 기본키인 경우
{sno, prof} > cname
prof > cname
Anomaly 를 체크해보자.
Insertion: primary key 를 null로 하면서 추가하지 못하는 상황이 있나 확인한다. P5라는 교수가 자료구조를 강의한다, 수강생이 결정이 안되었다면 (null, 자료구조, P5)가 되어야 하지만 기본키에 속하므로 저장할 수 없다. 따라서 있음.
Deletion: 100번 학생이 자료구조 취소하면 기본키라 튜플을 통째로 삭제해야 한다. 그러면 P2가 어떤 과목을 가르치는지 모른다. 마지막 300도 마찬가지. 따라서 있음.
Update: P1이 강의하는 과목의 이름을 프로그래밍 > 컴퓨터 프로그래밍으로 바꿔야 한다면 모두 찾아 바꿔야 한다. Updaate anomaly 있음.
3정규형인데도 Anomaly 발생이유?
cname 의 결정자인 prof 가 수퍼키가 아니기 때문.(prof 의 공통된 값들은 cname 도 같아야.결정자가 수퍼키가 아니라면 기본적으로 Update Anomaly 가 발생한다.) 따라서 결정자를 수퍼키로 만드는 것이 BCNF이다.
3정규형 충족, 모든 결정자가 수퍼키인 상태(중복 없음의 상태). 이를 strong 3NF 라 부르기도 한다. (결정자가 수퍼키라면 따로 decompose 하지 않아도 됨)
따라서 prof 공통으로 분리한 각 테이블은 다음과 같다.
enrolllprof는 결정자가 없고, cprof 의 prof 는 기본키인 동시에 수퍼키다. 따라서 중복이 없어 BCNF 를 만족!
따라서 앞서 다른 두 후보키를 기본키로 했을 때 케이스가 나뉘었고, 정규화 과정도 달랐다. 그러나 정규화 이후의 결과는 동일함을 알아두자. (정규화 목적이 Anomaly 를 없애는 것에 있으므로.)
Anomaly 분석
1. 세 att 모두 기본키여서 null 이 저장될 수 없으므로 insertion anomaly 존재.
2. Jane 이 OS 를 강의할 수 없을 때 null을 저장할 수 없으므로 존재.
3. Database 의 교재를 DB System 개정판으로 이름을 바꾸면 다 업데이트 해줘야 함.
Anomaly 존재, 이유는? 데이터의 중복이 너무 많기 때문이다.
특징?
이렇게 하면?
이렇게 해도 multivalue 라 문제가 생긴다. 이를 아래로 분할해볼 수 있다.
이러한 정규화는 multi-value 가 가능하다고 가정하고 거기서 시작한 것이다.
문제는 중복 데이터였다
다른 속성에 독립적인 att라면 4정규형을 통해 해결 가능.
course > teacher 하나를 결정하지 못하지만, 여러 개의 값을 결정할 때 Multi-Valued Dependency 를 유발. (다중값 종속)
X(course)가 multi-determine Y(teacher), R - X - Y (= Z = textbook)에 독립적으로 (조건은 두 개다, X가 여러 Y를 결정해야 하고, Z에 독립적이어야 한다, 만약 X, Y att 2개라면 MVD 성립하지 않음.)
이럴 경우 화살표 두 개를 쓴다.: course >> teacher / course >> textbook
학생이 한 명의 지도교수를 갖는다: 학생 > 지도교수
학생이 여러명의 지도교수를 갖는다: 학생 >> 지도교수
이렇게 independent 한 것을 어떻게 하는가? database 를 가르치는 teacher 가 새로 추가 되었다고 했을 때 textbook 수만큼 튜플이 추가되어야 한다.
MVD의 특성
기본키, 함수종속, MVD 해결 Normalization
기본키: {name, street, city, title, year} 모든 att 조합이다
함수종속: 없음
-street, city 와 title, year 처럼 묶인 이유는 title, year 은 서로 independent 하지 않기 때문이다. 만약 그렇다면 Star Wars 가 모든 연도에 입력되어 있어야 할 것.
따라서 릴레이션은 {name, street, city} 와 {name, title, year} 로 묶는다.
(anomaly 모두 해결)