본문 바로가기

Library/Database

함수 종속성(Functional Dependency)

함수 종속성(funational dependency, 이하 FD)은, 일종의 무결성 제약조건으로서, 키의 개념을 일반화한 것이다. 어떤 관계 스키마를 R이라 하고, X와 Y를 R에 속한 속성들의 집합이라 하자(X와 Y는 공집합이 아니다). 이제 R의 어떤 인스턴스 r에 속한 모든 튜플 t1, t2에 대해서 다음의 조건을 만족할 때 r은 FD X → Y를 만족한다고 한다.

만약, t1.X = t2.X이면, t1.Y = t2.Y이다. 즉, R에 있는 각각의 X 값이 R에 있는 정확하게 하나의 Y 값과 관련을 갖는다.

여기에서, t1.X는 튜플 t1을 X의 속성들로 프로젝션(projection)하는 것을 의미하는 것으로, 튜플 관계 해석의 표기법 t.a는 튜플 t의 속성 a를 지칭한다는 것을 자연스럽게 확장한 것이다. FD  X → Y는 결국 임의의 두 개의 튜플에 대해서 만약 X 속성들의 값이 일치한다면, Y 속성들의 값도 역시 일치해야 한다는 것을 의미한다.

여기서, FD는 키 제약조건(관계에 속한 필드들의 어떤 최소 부분집합이 각 튜플에 대한 고유한 식별자여야 한다는 조건. 이 제약 조건에 의해 튜플들을 유일하게 구별하는 필드 집합을 그 관계에 대한 키라고 한다)과 동일한 개념이 아니다.

어떤 관계의 인스턴스들이 합법적인 것이 되기 위해서는 각 인스턴스가 그 관계에 명시된 모든 FD를 포함한 모든 무결성 제약조건을 만족해야한다. 어떤 관계의 인스턴스를 보고 이 관계가 특정 FD를 만족하지 않는다고 말할 수는 있지만, 반대로 그 관계의 현재 일부 인스턴스들만 보고 주어진 FD를 만족한다고는 바로 추론할 수 없다. 그 이유는, FD는 다른 무결성 제약조건들과 마찬가지로 한 관계를 구성하는 모든 가능한 인스턴스들이 준수해야 할 요구사항에 대한 제약조건이기 때문이다.

기본키(primary key) 제약조건은 단지 FD의 특수한 경우이다. 키의 정의에 의하면, 어떤 관계에서 키는 항상 X의 역할을 하게 되며, 그 관계를 구성하는 모든 속성들은 Y의 역할을 한다는 점을 알 수 있다. 그러나 FD의 정의에 의하면 집합 X가 반드시 최소일 필요는 없다. 즉, 키를 포함하는 속성들의 집합(즉 수퍼 키)은 모두 X의 역할을 할 수 있다. 만약 X → Y에서 Y는 모든 속성들의 집합이며, X의 진부분 집합 V가 존재하여 V → Y가 만족된다면, X는 키가 아닌 수퍼 키이다.

어떤 관계 스키마에 정의된 FD들의 집합을 F라 표기하자. 이때 만약 어떤 FD f가 F의 모든 종속성들을 만족하는 각각의 모든 관계 인스턴스들에 의해 만족된다면, FD f가 F에 의해 내포(imply), 혹은 추론(infer)된다고 정의한다. 즉, F의 모든 FD들이 유지될 때마다, f도 역시 유지된다. 여기서 f가 F의 모든 종속성들을 만족하는 어떤 일부 인스턴스들에 대해서 유지된다고 하는 것은 불충분하며, f는 반드시 F의 모든 종속성들을 만족하는 각각의 모든 인스턴스에 대해서 유지된다.

FD를 만족하는 모든 f의 집합을 어떻게 구할 수 있는가? 이것은 FD closure(폐포)라 하며, F+로 표시한다. FD closure는 암스트롱의 공리(Armstrong's Axioms)라 하는 세가지 법칙을 반복해서 적용하는 것으로 FD의 집합 F에 의해 내포되는 모든 FD를 추론해 낼 수 있다. 암스트롱의 공리는 다음과 같다.

1. Recursivity : X ⊇ Y, X → Y
2. Augmentation : X → Y, XZ → YZ
3. Transitivy : X → Y, Y → Z, X → Z

암스트롱의 공리는, 정당(sound)하며, 완전(complete)하다. 즉, 주어진 FD들의 집합 F로부터 반드시 F+에 속하는 FD들만 생성할 수 있기 때문에 정당하다. 또한 위의 세 가지 법칙을 반복해서 적용하면 폐포(closure) F+에 속하는 모든 FD들을 생성할 수 있으므로 완전하다.

여기서, 재귀가 의미하는 것이 무엇인지 직관적으로 이해하기가 쉽지 않다. 재귀가 어떤 의미인지 파악하기 전에, X → Y라고 한다면, 화살표가 의미하는 것이 무엇인가? 여기서, X, Y는 각각 속성 집합을 의미한다. X → Y가 의미하는 것은, X가 주어졌을 때, X는 Y를 결정할 수 있다는 것이다. 예를 들어서, a, b, c 세 가지 속성이 있다고 하자. X ⊇ Y의 조건이라면, Y는 X의 부분집합이므로, X를 { a, b, c }라고 한다면 Y는 { a, b }라고 할 수 있고. 이 때 Y는 X의 부분집합임이 분명하다. X = { a, b, c }가 주어졌을때 당연히 { a, b }의 부분집합을 가리키는 X의 속성 값은 하나로 결정된다. 즉, 화살표는 어떤 속성 집합이 주어졌을때, 그 속성 값이 설정된다면, 화살표가 가리키는 방향의 속성 집합의 값들을 하나로 결정할 수 있다는 의미이다.

그렇다면, 재귀가 의미하는 것은 무엇인가? 어떤 속성 집합이 주어졌을때, 그것의 부분집합은 자기 자신으로 돌아올 수 밖에 없다는 의미가 된다.


다음의 법칙은, F+를 계산하기 위해 사용하면 편리하다.

결합(Union) : 만약 X → Y이고, X → Z이면, X → YZ이다.
분해(Decomposition) : 만약 X → YZ이면, X → Y이고, X → Z이다.


함수 종속성에서, 하나의 테이블에는 하나의 FD만 존재해야 하며, 중복이 존재한다면 스키마를 분해해서 중복을 제거하거나, 분해가 쉽지 않다면 중복을 최소한으로 유지해야 한다. FD의 대상이 되는 x 값이 키가 아니라면, 중복이 발생한다. 서로 의존 관계가 있는 것들 중에서, x가 키가 되도록 분해하는 것이 첫번째 단계이다. 이렇게하면, 삭제가 발생했을 때, 서로 간에 필요한 의존성 정보까지 사라지는 것을 방지할 수 있다. (서로 다른 테이블에 존재하기 때문이다)

그렇다면, 실제 스키마에서 어떻게 스키마 정제가 이루어지는가? 하나만의 FD를 유지하기 위해서, 먼저 속성들의 의존 관계를 함수 형태로 표시해야 하며, 이 FD에서 최소한의 의존 관계가 남을 때까지 계속해서 분해한다. 이 과정에서 암스트롱의 공리(Armstrong's Axiom)가 사용된다. 그리고, 이렇게 분해된 스키마가 좋은 설계인지, 더 작게 분해될 수 있는지 판단할 기준이 필요한데, 이러한 기준을 제공하기 위해서 몇가지 정규형들이 제안되었다. 속성들 사이의 의존 관계가 이 정규형 중 어느 하나에 속한다는 것을 알게되면, 해당 유형의 문제점은 발생하지 않는다는 것을 보장할 수 있다.