[DB] 정규화 - 함수 종속성 및 정규형 (종속성 규칙, 제 N정규형)
잘못 설계된 DB가 일으키는 이상현상
- 삭제이상: 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
- 삽입이상: 튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL 값을 입력해야 하는 현상
- 수정이상: 튜플 수정 시 중복된 데이터의 일부만 수정되어 데이터의 불일치 문제가 일어나는 현상
-> 이상현상을 없애기 위해서 테이블의 정규화가 필요함
<함수 종속성> : 릴레이션(테이블) 의 속성 사이의 의존성이 있는 것
A -> B 와 같이 표기함
A는 B의 결정자(Determinant)이고, B는 A의 종속속성(dependent attribute) 이다.
A는 B를 결정(Determine)하며 B는 A에 종속된다(Dependent)
예시)

학생번호(primary key) -> 학생이름, 주소, 학과 를 결정함(종속관계)
이 예시에서 학생번호는 (학생이름, 주소, 학과) 의 결정자(Determinant)
!!종속하는 것처럼 보이지만 그러지 않은 예
학생이름 -> 학과
학생이 한명 있으면 그 학생이 가지고 있는 학과도 하나 이기 때문에 1:1 매칭으로 생각할 수 있지만
학생 이름이 중복인 경우가 있을 수 있기 때문에 종속관계가 아님
A -> B 가 되려면 A의 정보만을 가지고 B를 도출해 낼 수 있어야 함
<함수 종속성 다이어그램> : 함수 종속성을 나타내는 표기법
예) 위의 테이블로 만든 다이어그램 예시

복합속성: 복합 키를 나타내는 것
(학생번호 + 강좌이름) 이 primary key가 되므로 묶어서 그린 것
테이블(릴레이션) 분리하기
-> 이상현상을 없애기 위해서는 기본키가 아닌 결정자를 없애줘야 함 (테이블 분리)
-> 분리하는 경우에는 기본키가 아닌 결정자를 원래 테이블에 남겨놓아야 함 (테이블간의 관계 형성)

<함수 종속성 규칙>
X, Y, Z가 릴레이션 R에 포함된 속성의 집합이라고 할 때, 함수 종속성에 관한 다음과 같은 규칙이 성립함.
- 부분집합 규칙

- 증가 규칙

- 이행 규칙

(삼단논법이랑 똑같다!)
이 세 규칙으로부터 도출된 새로운 세가지 규칙
- 결합 규칙

- 분해 규칙

- 유사이행 규칙

<제 1정규형>: 릴레이션 R의 모든 속성 값이 원자값을 가짐
ex) A -> B,C / A -> B, A -> C
<제 2정규형>: 제 1정규형이면서 PK가 아닌 속성들이 모두 PK에 완전함수종속임
-> 복합키에 전체적으로 의존하지 않는 속성 제거
ex) (A+{B -> D}) -> C / (A+B) -> C, B -> D
<제 3정규형>: 제 2정규형이면서 PK가 아닌 속성이 PK에 비이행적으로 종속함
-->기본키가 아닌 속성이 PK에 이행적으로 종속하는 것 없애기
ex) A(PK) -> B, A(PK) -> C, B -> C / A(PK) -> B, B -> C
와 같이 분리함으로써 B가 기본키가 됨
<BCNF>: 제 3정규형이면서 결정자가 PK가 아닌 함수적 종속을 제거함
-> 모든 결정자가 PK가 되도록 테이블을 분해
ex) (A, B) -> C , C -> B / A -> C, C -> B
와 같이 테이블을 분리함으로써 C도 PK가 됨
<무손실 분해>: 릴레이션 R을 릴레이션 R1과 R2로 분해할 때, R1 (join) R2 = R 이면 무손실 분해이다.