데이터베이스(11), 함수적 종속성과 정규화

2022. 12. 25. 22:52강의 내용 정리/데이터베이스

728x90
반응형

함수적 종속성 부록


Closure test
위첨자로 +를 붙여서 이를 사용한다.
Y는 어트리뷰트 집합을 의미한다.

Closure: 어트리뷰트들의 집합이 결정할 수 있는 모든 어트리뷰트를 모아놓은 것

Closure를 구하는 방법
1. 처음에는 Y+ = Y로 둔다.
ex) Y = {C, D} => Y+ = {C, D}

2. Y+에 포함된 X가 다른 어트리뷰트를 결정지으면 이를 Y+에 포함시킨다.
ex) X E Y+, X -> A => Y+에 A를 포함


요구사항에 따라 ABCD를 ABC와 AD로 분해한다. 이때 ABC와 AD의 함수적종속성을 알아야한다.
ABC의 함수적 종속성: AB -> C
AD의 함수적 종속성: D -> A

분해된 릴레이션에서는 C -> D의 함수적 종속성이 사라졌다. 또한 원래 있던 함수적 종속성을 고려해보면 C -> A가 되는데 해당 함수적 종속성도 분해된 릴레이션에서는 포함할 수 없다.

위의 문제를 해결하기 위해 Closure를 구해서 이를 처리할 수 있다.
A+ = {A}
B+ = {B}
C+ = {C, D, A}
D+ = {D, A}

어트리뷰트 하나만 있는 경우의 클로저를 구한 뒤 어트리뷰트 두 개가 있는 경우의 클로저를 구한다.
AB+ = {A+, B+, C+} = {A, B, C, D}

클로저를 통해 키 값을 구할 수 있다. 가능한 모든 부분 집합에 대해 클로저를 구할 수 있다. n개의 어트리뷰트에 대해 2의 n-1개만큼 구할 수 있다. ?

cf) FD의 프로젝션




정규화 부록

Drinkers는 부분 함수적 종속성이 발생한다. 이에 따라 이를 분해한다.


Drinkers1
- BCNF -> 결정자는 키밖에 없다.
- 함수적 종속성: name -> addr / name -> favBeer
- Closure
name+ = {name, addr, favBeer}
addr+ = {addr}
favBeer+ = {favBeer}
{name, addr}+ = {name, addr, favBeer}
{name, favBeer}+ = {name, addr, favBeer}
{addr, favBeer}+ = {name, addr, favBeer}
{name, addr, favBeer}+ = {name, addr, favBeer}


Drinkers2
- 제1정규형 -> 부분 함수적 종속성이 있다.
- 함수적 종속성: beersLiked -> manf / name, beersLiked -> manf
- Closure
name+ = {name}
beersLiked+ = {beersLiked, manf}
...

Drinkers3는 BCNF가 된다.
Drinkers4는 BCNF가 된다.


분해를 할 때 지켜야하는 것

recovery: 무손실 분해가 가능해서 이를 복구 가능해야한다.
dependency preservation: 제 3정규형까지는 dependency preservation이 가능하다. 하지만 BCNF를 만들면서 이를 지키지 못할 수 있다.

AB -> C, C -> B에 대한 함수적 종속성이 사라진다. 이에 따라 도메인의 시멘틱스가 사라질 수 있기에 dependency preservation가 위배된다.

기본키에 대해서만 완전 함수적 종속성을 만족시키지 못하지만 후보키에 대해 완전 함수적 종속성을 만족시키지 못한다면 문제가 발생할 수 있다. 따라서 모든 후보키에 대해 함수적 종속성을 해결할 경우에 중복성을 제거할 수 있다.

만약 기본키에 대해서만 함수적 종속성을 해결한다면 일련번호를 통해 함수적 종속성을 해결할 수 있지만 중복성이 여전히 남아있을 수 있다. 따라서 기본키에 대해서만 함수적 종속성을 해결할 경우에는 중복성을 제거할 수 없다.

728x90
반응형