이번 글에서는 데이터베이스가 현실을 제대로 반영했는지를 판단하는 기준 중 하나인 함수 종속Functional Dependency에 대해 알아봅니다.
데이터베이스는 현실 세계를 본떠 설계하기 때문에, 데이터베이스의 객체와 관계는 현실 세계의 여러 제약을 반영해야 한다. 관계의 인스턴스 중 현실 세계의 제약 조건을 충족하는 인스턴스를 관계의 적법한 인스턴스Legal Instance라 부르며, 데이터베이스의 적법한 인스턴스는 데이터베이스 내의 모든 관계 인스턴스가 적법한 경우다. 현실 세계의 제약 조건을 데이터베이스로 가져오기 위해서는 이 제약 조건이 수식으로 표현되어야 하지만, 보통 현실 세계의 제약 조건은 모든 학생은 고유의 학번을 가진다와 같이 문장으로 되어 있다.
Functional Dependency
여기서 등장하는 것이 바로 함수 종속Functional Dependency이다. 관계 스키마가 인 관계 과 의 속성인 , 그리고 의 인스턴스에 속하는 임의의 튜플 에 대하여 일 때 언제나 라면 해당 인스턴스에 대하여 함수 종속 가 성립한다고 말한다. 그리고 의 모든 합법적인 인스턴스에서 함수 종속 가 성립할 때 함수 종속 가 에서 유지된다고 말한다. 그리고 데이터베이스에서 속성의 이름이 한가지 의미만 가진다면, 함수 종속 가 데이터베이스의 제약 조건으로 유지될 때 이면서 해당 데이터베이스에 존재하는 임의의 스키마 에 대하여 함수 종속 가 반드시 성립해야 한다.
함수 종속은 속성의 집합으로 튜플을 구분하는 슈퍼 키에 비해 더 광범위한 제약 조건을 표현할 수 있게 해주며 속성 간의 관계로 구현된 제약 조건을 나타낸다. 그런데 어떤 함수 종속은 현실의 제약 조건과는 거리가 멀어 보인다.

함수 종속 는 정의상 성립하기는 하지만, 현실에서 강의실 번호가 같아도 건물이 다르면 강의실의 수용 인원이 다르다는 것을 우리는 알고 있다. 반면, 여기에 건물에 대한 정보까지 함께 적용한 함수 종속 는 현실의 제약 조건을 반영하며 의 인스턴스에서 유지될 것이다.
Trivial Functional Dependency
모든 관계에서 유지되는 함수 종속은 자명하다Trivial고 말하는데, 이러한 함수 종속은 나 와 같이 인 에 대하여 의 형태로 정의된다.
Logical Implication
관계 스키마 에 대하여 함수 종속의 집합 가 주어졌을 때, 에서 다른 함수 종속 가 논리적으로 함축Logically Implied된다는 것은 를 만족하는 모든 관계 인스턴스가 도 만족한다는 의미다.
예를 들어, 가 주어졌을 때, 두 튜플 에 대해 라면, 에 의해 이 성립하고 에 의해 이 성립하므로 가 논리적으로 함의된다.
Closure of Functional Dependencies
앞서 살펴본 경우와 같이 어떤 함수 종속들의 집합 가 관계 에서 유지될 때 에 존재하는 함수 종속들을 연결하여 에서 유지되는 다른 함수 종속을 끄집어 낼 수도 있다. 와 가 유지된다면 도 유지될 것이다. 이렇게 암묵적으로 유지되는 함수 종속을 하나둘 에 합치다 보면 에서 유추할 수 있는 모든 함수 종속의 집합이 탄생한다. 이 집합을 의 클로저Closure라 부르며, 로 표기한다.
Armstrong's Axioms
를 체계적으로 구하기 위해서는 암스트롱 공리Armstrong's Axioms를 사용한다. 이 공리들은 건전하고sound 완전하다complete. 건전하다는 것은 잘못된 함수 종속을 생성하지 않는다는 의미이며, 완전하다는 것은 의 모든 원소를 생성할 수 있다는 의미다.
공리
암스트롱 공리는 세가지 공리에서 출발한다.
- 반사성 규칙Reflexivity Rule: 이면 가 성립한다.
- 예를 들어 면 가 성립하는데, 이는 와 가 성립하기 떄문이다.
- 확장 규칙Augmentation Rule: 가 성립하고 가 속성 집합이면 가 성립한다.
- 예를 들어 이면 가 성립한다.
- 이행 규칙Transitivity Rule: 와 가 성립하면 가 성립한다.
- 예를 들어 이고 이면 가 성립한다.
추가 규칙
이 기본 공리를 통하여 추가할 수 있는 법칙이 세가지 더 있다.
- 합집합 규칙Union Rule: 와 가 성립하면 가 성립한다.
- 예를 들어 이고 이면 인데, 이는
- 분해 규칙Decomposition Rule: 가 성립하면 와 가 성립한다.
- 예를 들어 이면 이고 인데, 이는 이기 때문에 반사성 규칙에 의해 와 가 성립하고, 이행 규칙에 의해 와 가 성립하기 때문이다.
- 의사이행 규칙Pseudotransitivity Rule: 와 가 성립하면 가 성립한다. - 예를 들어 이고 이면 가 성립하는데, 이는 확장 규칙에 의해 일 때 가 성립하고, 따라서 이행 규칙에 의해 가 성립하기 때문이다.
계산하기
이제 암스트롱 공리를 이용해 를 계산하는 절차를 알아보자.

우선 에 반사성 규칙울 적용하여 모든 자명한 종속을 생성한 뒤 이를 집합 에 포함시킨다. 그 다음 가 변하지 않을 때까지 다음의 과정을 반복한다.
- 와 의 모든 자명한 종속에 대하여 확장 규칙을 적용한 결과를 에 추가한다.
- 에서 함수 종속을 2개씩 뽑아 순서쌍 를 만들고, 이렇게 만들 수 있는 서로 다른 모든 순서쌍에 대하여 과 를 이행 규칙으로 결합할 수 있다면 그 결과 또한 에 추가한다.
F+ = F
반사성 규칙울 적용하여 모든 자명한 종속을 생성한다.
반복:
F+의 각 함수 종속 f에 대해:
f에 확장 규칙 적용
결과를 F+에 추가
F+의 각 함수 종속 쌍 (f1, f2)에 대해:
f1과 f2를 이행 규칙으로 결합 가능하면:
결과를 F+에 추가
F+가 더 이상 변하지 않을 때까지
Attribute Closure
속성 집합 의 클로저 는 함수 종속의 집합 하에서 에 의해 함수적으로 결정되는 모든 속성의 집합이다. 이는 를 계산하는 것보다 훨씬 효율적으로 계산할 수 있다.
속성 클로저 계산하기

result := α
반복:
F의 각 함수 종속 β → γ에 대해:
만약 β ⊆ result이면:
result := result ∪ γ
result가 더 이상 변하지 않을 때까지
예제를 살펴보자. 가 주어졌을 때 속성 집합 에 대하여 속성 클로저 를 계산하면 다음과 같은 과정을 통해 계산하게 된다.
- 적용:
- 적용:
- 적용:
- 적용:
- 더 이상 변화 없음
따라서 가 된다.
속성 클로저의 활용
이렇게 구한 속성 클로저는 슈퍼키 테스트, 함수 종속의 검증, 계산 등 다양한 용도로 활용한다.
- 슈퍼키 테스트: 가 슈퍼키인지 확인하려면 가 의 모든 속성을 포함하는지 확인한다.
- 함수 종속의 검증: 가 에 속하는지 확인하려면 인지 확인한다.
- 계산: 모든 에 대해 를 계산하고, 각 에 대해 를 출력한다.
Canonical Cover
어떤 관계 스키마에 대하여 함수 종속의 집합 가 주어졌을 때, 데이터베이스가 제 기능을 수행하기 위해서는 데이터베이스 내에서 업데이트가 이루어질 때마다 모든 함수 종속성이 지켜져야 한다.1 그런데 모든 종속성을 확인하는 것은 비용이 많이 들기 때문에, 와 동일한 클로저를 가지지만 더 단순한 집합이 있다면 이쪽을 사용하는 것이 더 효율적이다. 이러한 집합은 실제로 존재하며, 이를 캐노니컬 커버Canonical Cover라 부르고 기호로는 라고 한다. 이제 이 캐노니컬 커버를 만드는 과정을 살펴보자.
Extraneous Attribute
우선 불필요한 속성에 대해 알아보자. 함수 종속 에서 함수 종속의 한 속성 가 불필요Extraneous하다는 것은 를 제거해도 가 변하지 않는다는 의미다. 이게 무슨 뜻인지 이해하려면 함수 종속 내에서 가 자리한 위치를 기준으로 나누어 생각해 보아야 한다.
좌항에서의 불필요성
함수 종속의 좌항에서 어떤 속성을 제거한다는 것은 기본적으로 제약을 더욱 강하게 만든다는 것을 의미한다. 그러나 속성 가 좌항에서 불필요하다면 를 제거해도 함수 종속의 제약은 변하지 않으며, 는 를 논리적으로 함축한다. 이를 테스트하기 위해서는 에 대해 를 하에서 계산하고, 가 의 모든 속성을 포함하는지 확인하면 된다.
우항에서의 불필요성
함수 종속의 우항에서 어떤 속성을 제거한다는 것은 기본적으로 제약을 더욱 약하게 만들어낸다는 것을 의미한다. 그러나 속성 가 우변에서 불필요하다면 를 제거해도 함수 종속의 제약은 변하지 않으며, 가 를 논리적으로 함축한다. 이를 테스트하기 위해서는 하에서 를 계산하고, 가 를 포함하는지 확인한다.
예를 들어 에서 의 가 불필요한지 확인하려면, 하에서 를 계산해보면 된다. 그 결과는 로, 여기에 가 포함되므로 는 불필요하다는 결론에 도달하게 된다.
캐노니컬 커버 계산하기
이제 캐노니컬 커버를 계산하는 과정에 대해 이해할 준비가 됐다. 우선 캐노니컬 커버를 엄밀하게 정의해보자.
캐노니컬 커버 는 다음 조건을 만족한다:
- 와 는 논리적으로 동등하다. ()
- 의 어떤 함수 종속도 불필요한 속성을 포함하지 않는다.
- 의 각 함수 종속의 좌항은 유일하다. 즉, 같은 좌항을 가진 함수 종속이 없다.
이 정의에 근거하여 캐노니컬 커버를 계산하는 알고리즘은 아래와 같다.

우선 를 출발점으로 삼고 더이상 집합에 변동이 없을 때까지 다음의 과정을 반복한다.
- 합집합 규칙을 사용하여 에서 과 형태의 모든 종속을 로 대체한다.
- 불필요한 속성을 가진 함수 종속을 찾고, 있으면 해당 함수 종속에서 불필요한 속성을 제거한다. 이를 위한 테스트는 를 기준으로 진행한다.
Fc := F
반복:
합집합 규칙을 사용하여 Fc에서 α1 → β1과 α1 → β2 형태의
종속을 α1 → β1β2로 결합
Fc에서 불필요한 속성을 가진 함수 종속 α → β를 찾음
(테스트는 F가 아닌 Fc를 사용)
불필요한 속성이 발견되면 α → β에서 삭제
Fc가 더 이상 변하지 않을 때까지
예를 들어 에 대해 캐노니컬 커버를 계산하는 과정은 아래와 같다.
- 와 를 결합하면 가 된다.
- 가 이미 존재하기 때문에 에서 가 불필요하다.
- 와 를 통해 이행 규칙으로 를 유도할 수 있기 때문에, 에서 가 불필요하다.
- 그 결과, 이다.
캐노니컬 커버의 유일성
캐노니컬 커버는 유일하지 않을 수 있다. 어떤 불필요한 속성을 먼저 제거하느냐에 따라 다른 캐노니컬 커버가 생성될 수 있는데, 예를 들어 의 경우 , 등등 여러가지 버전의 캐노니컬 커버가 존재한다.
Dependency Preservation
데이터베이스 스키마 을 으로 분해할 때, 각 에 대한 의 한정restriction 은 에서 의 속성만을 포함하는 모든 함수 종속의 집합이다. 이때 분해가 종속성을 보존Dependency Preserving한다는 것은 의 클로저가 와 같다는 의미다. 즉, 를 만족하는 분해를 종속성 보존 분해Dependency-Preserving Decomposition이라 부른다.
각 의 함수 종속은 해당 관계만 확인하면 되므로 종속성 보존을 활용하면 효율적으로 검증할 수 있다.
종속성 보존 테스트

종속성 보존을 테스트하려면 위와 같은 알고리즘을 적용해야 하지만, 이 알고리즘은 를 계산할 것을 요구하기 때문에 계산 비용이 높다. 대신 조금 더 간단한 테스트 방법이 두가지 있다.
하나는 의 각 함수 의존성이 분해된 관계 중 하나에서 테스트 가능한지를 보는 것이다. 쉬운 방법이기는 하지만 언제나 먹히는 방법은 아니다. 실패하면 얄짤없이 를 계산해야 한다.

또다른 방법은 를 계산하지 않는 방법인데, 의 각 함수 종속 에 대하여 위의 테스트를 적용하면 된다.
함수 의존성의 활용
함수 의존성은 크게 두 가지 상황에서 사용하는데, 관계의 인스턴스들이 함수 종속의 집합 를 만족하는지 확인하는 검증Verification 상황이며, 다른 하나는 합법적인 관계들의 집합에 존재하는 제약 조건을 기술하는 명세Specification 상황이다. 또한 만약 관계 스키마 전체에 대하여 가 충족한다면 그때는 가 에서 유지된다고 말한다. 함수 의존성은 정규화Normalization 과정에서 좋은 데이터베이스 설계를 판단하는 핵심 도구로 사용된다.
출처
- Silberschatz, A., Korth, H.F. and Sudarshan, S. (2020) Database system concepts. Seventh edition. New York, NY: McGraw-Hill.
Footnotes
-
물론 함수 의존성이 하나라도 지켜지지 않으면 롤백rollback되어야 한다. ↩