릴레이션에 삽입,삭제,갱신 시 이상한 점이 발생할 수 있음
이상(anomaly)의 원인은?
: 애트리뷰트들 간에 존재하는 여러 종속관계를 하나의 릴레이션에 표현
해결방법은?
: 애트리뷰트들 간의 종속관계를 분석하여 여러 개의 릴레이션으로 분해
-> 정규화
함수 종속 (Functional Dependency)
릴레이션 R에서 애트리뷰트 X의 값에 대해 애트리뷰트 Y의 값이 하나만 연관 (X->Y)
ex) 학번 -> 이름 <학번 값에 대해 이름 값 하나만 연관>
쉽게 말해 X를 알면 Y를 알 수 있다.
X는 Y의 결정자, Y는 X의 종속자
X,Y는 복합 애트리뷰트일 수 있음
ex) (학번,과목) -> 성적
특징) X가 후보키이면, R의 모든 애트리뷰트 Y에 대해 X->Y가 성립한다.
수강 릴레이션(학번, 학년, 과목번호,성적)에서 기본키는?
: (학번,과목 번호)
함수 종속은?
: (학번,과목번호)->성적, 학번->학년

Augmentation
XZ->YZ라면 X->Y인가? : NO
(학번,과목번호)->(성적,과목번호)이지만 (학번)->(성적)은 성립하지 않는다. <과목번호가 필요>
모든 함수 종속(FD)들의 집합: F+ (F closure)

정규형(Normal Form)
일련의 제약 조건을 만족하는 릴레이션
정규화의 과정
1. 애트리뷰트들과 제약조건(종속성)들을 수집 <F+>
2. 제약조건에 따라 여러 개의 릴레이션으로 분할 -> 스키마 변환
정규화의 원칙
1. 무손실 표현 (같은 의미의 정보 유지)
2. 데이터의 중복성 감소
3. 분리의 원칙
[독립적인 관계는 별개의 릴레이션으로 표현]
제1정규형(1NF)
: 모든 도메인이 원자 값만으로 된 릴레이션
(원자 값: 더 이상 쪼갤 수 없는 값, ex) 학번이 100이라면 10,0으로 쪼갤 수 없음)

기본키: (학번,과목번호)
1NF에서의 이상

1. 개체 무결성에 위배됨 (과목번호가 null)
2. 연쇄 삭제가 발생됨 (원하지 않는 [정보의 삭제]가 일어남)
3. 업데이트에서 시간이 너무 많이 소요됨


X = (학번,과목번호)이면 X’ = 학번 or 과목번호이다.
1. (학년)은 (학번)에 완전 함수 종속인가? <학번->학년>
-> 학번이 X이고 X’은 존재하지 않음, X->Y를 만족하고 X’->Y를 만족하지 않으니 YES
2. (학년)은 (학번,과목번호)에 완전 함수 종속인가? <(학번,과목번호)->학년>
-> (학번,과목번호)가 X이고 X’은 (학번or과목번호)임. (x’:학번)->(학년)을 만족하니 NO
3. (성적)은 (학번,과목번호)에 완전 함수 종속인가? <(학번,과목번호)->성적>
-> (학번,과목번호)가 X이고 X’은 (학번or과목번호)임. X’ -> 성적(Y)를 만족하지 않으니 YES
이상의 원인: 기본키에 부분함수 종속된 애트리뷰튜가 존재
<(학번,과목번호)가 학년을 결정하는데 학번도 학년을 결정함>
해결: 릴레이션을 분해(부분 함수 종속을 제거) -> 2NF
제2정규형(2NF)
: 1NF이고 키에 속하지 않는 모든 애트리뷰트들이 기본 키에 완전 함수 종속





1. (null,p4,물리학과) 같은 경우 삽입 불가 -> 개체 무결성에 위배
2. 연쇄 삭제가 발생됨 (원하지 않는 [정보의 삭제]가 일어남)
3. (100,p1,컴퓨터) 뿐 만 아니라 (400,p1,컴퓨터)도 변경해야 됨, 만약 p1이 포함된 튜플이 더 많으면 시간이 많이 소요됨
-> 업데이트에서 시간이 너무 많이 소요됨
원인: 이행적 함수 종속이 존재
A->B와 B->C이니 A->C가 됨
<학번이 지도교수를 결정하는데 지도교수가 학과를 결정함>
해결: 릴레이션을 분해(이행적 함수 종속을 제거) -> 3NF
제3정규형(3NF)
: 2NF이고 후보키에 속하지 않는 모든 애트리뷰트들이 후보 키에 이행적 함수 종속되지 않음


보이스코드 정규형 (BCNF)
릴레이션 R의 모든 결정자가 후보 키이면 릴레이션 R은 BCNF에 속함
릴레이션 R이 BCNF에 속하면 R은 제1,제2,제3 정규형에 속함
강한 제3정규형이라고도 부름
(ex)

[문제]

함수 종속은?
(학번,과목명) -> 교수, 교수 -> 과목명
후보키는?
(학번,과목명), (학번,교수)
3NF인가?
YES. 모든 애트리뷰트들이 기본 키에 완전 함수 종속, 모든 애트리뷰트들이 후보 키에 이행적 함수 종속되지 않음
BCNF인가?
NO. 교수가 후보키가 아니므로 보이스코드가 아님

원인: 교수가 결정자이나 후보 키가 아니므로

(참고: 후보키끼리는 누가 누구를 결정한다고 볼 수 없다. 따라서 학번->교수->과목명이어서 학번->과목명이 성립하니 이행적 함수 종속이라고 말하지 않는 것)
제4정규형(4NF)
: BNCF이고 릴레이션에서 다치 종속을 제거한 정규형

제5정규형(5NF)
: 4NF이고 릴레이션에 존재하는 조인 종속이 후보키를 통해서만 성립이 되도록 하는 정규형

정규화 과정 (무손실 분해)

정규화의 장점은?
데이터 중복이 줄어들고 이상을 해결할 수 있다.

원래 데이터 수: 50개, 정규화 후 데이터 수: 44개 <중복 제거>
정규화의 단점은?
테이블 수가 많아질수록(정규화(분해)가 많아질수록) 조건 결합, 즉 join의 부담으로 인해 답은 더 늦게 나올 수 있음
->역정규화(비정규화 또는 반정규화): 중복을 허용하더라도 다시 통합하여 구조를 재조정하는 것 (4정규형 -> 3정규형),
3NF 혹은 BCNF가 가장 많이 쓰임