함수 종속성 (Functional Dependency)

작성일

개요

함수 종속성은 데이터베이스를 설계하는 방법의 기본이 되는 개념이며, 정규화에서도 중요하게 다루는 개념이므로 알아두는 것이 좋다.

Functional Dependency

Functional Dependency(함수 종속)는 한 테이블에 있는 두 개의 attribute(s) 집합 사이의 제약(constraint)을 뜻한다.

Functional Dependency를 이해하기 위해 아래 그림을 살펴보자.

1

  • Employee 테이블과 attribute들이다.
  • 집합 X = {empl_id}, 집합 Y = {empl_name, birth_date, position, salary}
  • X 값에 따라 Y 값이 유일하게 결정될 때, ‘X가 Y를 함수적으로 결정한다’, ‘Y가 X를 함수적으로 의존한다’ 라고 말할 수 있다.
  • 이와 같이 두 집합 사이의 제약 관계를 Funcation Dependency라고 부른다.
  • 그리고 X와 Y의 관계를 X → Y라고 표기한다.
  • 집합 X는 결정자, 집합 Y는 종속자라 한다.
  • X는 left-hand side, Y는 right-hand side라고도 한다.
  • X → Y가 성립한다고 해서 Y → X가 반드시 성립하진 않는다.
    • 예) {empl_id} → {empl_name} (O), {empl_name} → {empl_id} (X)

Functional Dependency 찾는 방법

Functional Dependency는 테이블의 스키마를 보고 의미적으로 파악해야 한다. 테이블의 state를 보고 Functional Dependency를 파악해서는 안된다.

예를 들어 위의 Employee 테이블에서 {empl_name} → {birth_date}가 성립될까? 이름에 따라 생일이 다를 수도 있지만 동명이인의 경우가 있으므로 {empl_name} → {birth_date}은 성립되지 않는다.

이처럼 테이블의 특정 순간의 특정 상태만 보고 Functional Dependency를 파악하면 안된다.

그렇다면 {empl_id} → {empl_name, birth_date, position, salary, dept_id}가 성립할까? 여기서도 의미적으로 접근해야 한다.

  • 만약, 이 회사의 정책이 임직원은 반드시 한 부서에만 속해야 한다면? X → Y 성립 (O)
  • 만약, 이 회사의 정책이 임직원이 하나 이상의 부서에 속할 수 있다면? X → Y 성립하지 않음 (X)

결론적으로 구축하려는 DB의 attributes가 관계적으로 어떤 의미를 지닐지에 따라 Functional Dependency가 달라진다.

Functional Dependency 예시

  • {stu_id} → {stu_name, birth_date, address}
  • {class_id} → {class_name, year, credit}
  • {stu_id, class_id} → {grade}
  • {bank_name, bank_account} → {balance, open_date}

{} → Y

Y 값은 언제나 하나의 값만을 가진다는 의미이다.

  • {}는 공집합을 의미한다.
  • 공집합에서 Y로의 종속성은 Y가 항상 동일한 값을 가지는 속성이라는 의미이다.

2

  • company attribute가 항상 같은 값만 가지게 된다면 {} → {company}가 성립한다.
  • 참고로 이 부분은 정규화 중 2NF와 관련된 내용이다.

Trival Functional Dependency

X → Y 일 때, 오른쪽 집합(Y)이 왼쪽 집합(X)에 부분 집합이라면 trivial functional dependency라고 한다.

trivial functional dependency 예시

  • {a, b, c} → {c}
  • {a, b, c} → {a, c}
  • {a, b, c} → {a, b, c}

Non-trival Functional Dependency

X가 Y를 결정 짓는 Funcational Dependency일때, 만약 Y가 X의 부분집합이 아니라면 non-trivial functional dependency라 한다.

non-trivial functional dependency 예시

  • {a, b, c} → {b, c, d}
  • {a, b, c} → {d, e}
    • 특히, 이 두 집합은 공통된 attributes가 하나도 없다. 이땐, non-trivial functional dependency 또는 completely non-trivial functional dependency라고 한다.

Partial Functional Dependency

X가 Y를 결정 짓는 Functional Dependency가 존재한다고 했을 때, X의 proper subset 중 하나라도 Y를 결정 지을 수 있다면 여기서 X → Y를 partial functional dependency라고 한다.

여기서 proper subset의미는 다음과 같다. 집합 X의 proper subset은 X의 부분 집합이지만 X와 동일하지 않은 집합을 의미한다.

  • 예를 들어 X = {a, b, c} 일 때 {a, c}, {a}, {}는 모두 X의 proper subset이다.
  • 반면에 {a, b, c}는 X의 proper subset이 아니다.

{empl_id, empl_name} → {birth_date} 일 때, {empl_id}는 {birth_date}를 결정할 수 있으므로 {empl_id, empl_name} → {birth_date}은 partial functional dependency이다.

Full FD

partial functional dependency가 아닌 경우를 Full Functional Dependency라 한다.

X가 Y를 결정 짓는 Functional Dependency가 존재한다고 했을 때, X의 proper subset 중 하나라도 Y를 결정 지을 수 없다면 여기서 X → Y를 full functional dependency라고 한다.

{stu_id, class_id}의 proper subset은 {stu_id}, {class_id}, {}이다. 이 세가지는 {grade}를 결정지을 수 없다. 따라서 full functional dependency이다.

카테고리: