본문 바로가기

Library/Database

Lossless-join Decomposition

무손실 조인 분해라는 것은, 나뉘어진 2개의 관계를 합쳤을 때, 원래 가지고 있던 테이블에서 어떠한 데이터 손실이 없다는 것을 의미한다. 스키마를 정제할 때, 스키마를 분할하고 합칠 때 데이터의 손실이 발생한다면 이 작업은 잘못된 것이다. R을 어떤 관계 스키마라 하고, F를 R에 정의된 FD들의 집합이라 하자. R을 속성들의 집합 X와 Y로 구성된 두개의 스키마로 분해했을 때, F에 속하는 종속성을 만족하는 R의 모든 인스턴스 r에 대해, π(x)(r) join π(Y )(r) = r이 성립하면, 이러한 분해를 무손실 조인 분해라 한다. 물론, 새롭게 추가되는 정보도 없다.

중복성을 제거하기 위해 사용되는 분해는 반드시 무손실이어야 한다. 무손실인지 아닌지 검증하기 위해, 다음의 정리가 사용된다. R을 어떤 관계라 하고, F를 R에 정의된 FD들의 집합이라 하자. R을 속성들의 집합 R1과 R2로 분해했을 때, F+는 FD R1 ∩ R2 → R1 또는 FD R1 ∩ R2 → R2를 포함하면 무손실 분해이다.

이 정리에 의하면, R1과 R2에 공통적으로 속한 속성들은 반드시 R1 혹은 R2에 속한 키를 포함해야 한다. 만약, 분해되는 두 관계가 공통 키를 포함하지 않는다면, 이들을 다시 조인할 때 원래의 관계에는 없었던 튜플이 만들어진다. 원하지 않은 정보가 발생했다는 측면에서 본다면, 이것은 명백히 정보의 손실이라 할 수 있다. 이 방법은 반드시 두 개의 관계로만 분해할 때 사용될 수 있다. 즉, 다음과 같은 결론을 얻을 수 있다.

만약, 어떤 관계 R에 FD X → Y가 존재하고, X ∩ Y가 공집합이면, R을 R - Y와 XY로 분해하면, 이 분해는 무손실 조인이다. 즉, X는 R - Y(X ∩ Y가 공집합이므로)와 XY에서도 모두 나타나고, XY에 대해 키가 된다.

여기서 중요한 다른 사실은, 분해를 여러 번 반복해서 적용할 수 있다는 점이다. 어떤 관계 R을 무손실 조인 분해에 의해 R1과 R2로 분해하였고, R1을 다시 다른 무손실 조인 분해에 의해 R11과 R12로 분해했다고 하자. 그러면 R을 R11, R12, R2로 분해한 것은 역시 무손실 조인을 보장한다. 왜냐하면, R11과 R12을 조인하면 R1을 복구할 수 있고, 다시 R1과 R2를 조인하면 R을 복구할 수 있기 때문이다.