attribute α 의 집합이 주어졌을 때, F 아래 α를 함수적으로 결정되는 모든 attribute의 집합을 “closure of α under F” 라고 부른다.
주어진 애트리뷰트 집합에 의해 결정되는 모든 애트리뷰트의 집합
용도
α+를 계산하기 위한 알고리즘, the closure of α under F
Super key 테스트
functional dependency 테스트
functional dependency α → β 가 성립하는지 확인하기 위해, β ⊆ α+ 인지 확인한다.
즉, attribute closure를 이용해 α+를 계산하고, α+가 β를 포함하는지 확인한다.
이것은 쉽고 값 싼 테스트이고 매우 유용하다.
F의 closure를 계산
각각의 S ⊆ γ+ 를 확인하기 위해, 각각의 γ ⊆ R 에 대해, γ+를 찾아낸다. 그리고 functional dependency γ → S를 도출한다.
e.g.) ABC → A, ABC → AB..
attribute set closure는 해당 스키마의 candidate key를 찾아내기 위해 활용할 수 있다.
R = (A, B, C, G, H, I)
F = {A → B, A → C, CG → H, CG →I, B → H}
(AG)+
result = AG
result = AGB (A →B)
result = AGBC (A → C)
result = AGBCH (CG → H)
result = AGBCHI (CG →I)
result = AGBCHI (B → H)
AG는 candidate key 인가? YES
F’+ = F+ 인 임의의 F’를 F의 cover 라고 한다.
F와 동일한 Closure를 갖는 FD 집합
예) F {A → B, A → AC, A → BC} 와 F’ {A→B, A→C}
만약 {F - {g})+ = F+ or g ∈ (F - {g})+ 이면,
FD g ∈ F 는 불필요하다.
F’은 F의 중복이 없는 (minimal) cover이다.
F’+ = F+ 이고 F’는 불필요한 FD를 포함하지 않는다.
주어진 FD 집합과 동일한 최소의 FD 집합 (불필요한 FD 제거)
Functional dependency 집합은 다른 것들로 부터 유추가능한 불필요한 dependencies를 가지고 있을 수 있다.
e.g.) A → C 는 다음 집합에서 불필요하다. in: {A → B, B → C, A → C}
functional dependency의 일부분이 불필요할 수 있다.
α → β 에서 α는 LHS(Left Hand Side), β는 RHS(Right Hand Side)라고 부른다.
e.g. on LHS:
e.g. on RHS:
직관적으로, F의 canonical cover는 dependency 전체 혹은 일부에 불필요한 부분이 없는, F와 동일한 functional dependency 집합을 가지는 minimal 한 집합이다.
Extraneous Attributes: 없어져도 무관한 애트리븉
정의: α → β in F.
만약 A ∈ α 이고,
F가 (F - {α → β}) U {(α - A) → β} 을 논리적으로 함축한다면
Attribute A는 α에서 무관하다.
만약 A ∈ β 이고,
(F - {α → β}) U {α → (β - A)} 가 F 임을 논리적으로 함축한다면
Attribute A는 β에 무관하다.
위의 각 경우에서 반대방향에서의 함축은 자명하다. stronger functional dependency는 항상 weaker one을 함축하기 때문이다.
F = A → B: strong
F’ = AC → B: weak
F → F’ 은 always trivial
but, F’ → F 는 don’t know
F = {A → C, AB → C} 를 가정해보자.
F = {A → C, AB → CD} 를 가정해보자.
functional dependency의 집합 F가 있고, F에 functional dependency α → β 가 있는 경우를 고려해보자.
α에서 어트리뷰트 A ∈ α 가 무관한지 테스트
F의 dependencies들을 이용해 ({α} - A)+를 계산한다.
({α} - A)+가 β를 포함하는지 확인한다. 만약 그렇다면, A는 α에서 무관한 애트리뷰트이다.
β에서 어트리뷰트 A ∈ β 가 무관한지 테스트
F’ = (F - {α → β}) U {α → (β - A)} 의 dependencies 만을 사용해 α+를 계산한다.
α+ 가 A를 포함하는 지 확인한다. 만약 그렇다면, A는 β에서 무관한 애트리뷰트이다.
F의 canonical cover는 dependencies Fc의 집합이다. Fc such that
Fc+ = F+
Fc의 어떤 FD도 무관한 애트리뷰트를 포함하지 않는다.
Fc의 각 FD의 left side는 unique 하다.
즉, 정리하자면 Canonical cover란 불필요한 attribute는 없고, FD의 (동일한) 왼쪽 편이 두번 이상 나오지 않도록 한 cover이다.
F의 Canonical cover 계산:
repeat
until F does not change
주의: 일부 무관한 어트리뷰트가 삭제된 후에 union rule이 적용될 수 있으므로 다시 적용해야 한다.
R = (A, B, C), F = {A → BC, B → C, A → B, AB → C}
A → BC 와 A → B를 결합해 A → BC로 만든다.
AB → C에서 A는 무관하다.
A → BC 에서 C는 무관하다.
A → B와 다른 dependency들에 의해 A → C가 논리적으로 함축될 수 있는지 확인한다.
YES: A → B, B → C 에 transitivity를 이용한다.
Canonical cover is: {A → B, B → C}
보완할 부분이 있으면 댓글 남겨주세요. :)