CS 지식/데이터베이스

Relational Database Design(2) - functional dependency(함수 종속)

goldpig 2023. 11. 7. 00:06
728x90

  이번 시간에는 DB를 설계하는 방법의 기본이 되는 functional dependency(함수 종속)에 대해서 공부해 보도록 하겠습니다. 이상현상이 발생하지 않도록, 테이블을 관련있는 속성들로만 구성하기 위해 테이블을 분해하는 과정을 정규화라고 하였습니다. 그리고 함수적 종속성을 판단하여 정규화를 수행합니다. 

Functional dependency(함수 종속)

한 테이블에 있는 두 개의 attribute(s)집합(set) 사이의 제약(a constraint)를 의미합니다. 예를들어, EMPLOYEE 테이블에 6개의 attributes가 있는데 다음과 같이 두개의 집합으로 나눠보겠습니다. 그러면 이 두개의 집합 사이에 어떤 관계가 있을까요?

출처: 쉬운코드

이 두 집합 사이에는 서로 다른 두 튜플의 X 값이 같다면 Y 값도 같다 라는 특징이 있습니다. 왜냐하면 empl_id는 여러 임직원 중에 특정 한명을 지정하기 위한 값으로 임직원 마다의 고유한 id 입니다. 그래서 id 값이 같다면 나머지 Y집합에 있는 값들이 동일할 것입니다. 따라서 X의 값이 같다면 Y의 값도 같을 것입니다.

출처: 쉬운코드

그래서 이러한 관계를 기호로 나타내면 X -> Y 로 표현할 수 있습니다. 즉 집합 X가 집합 Y를 결정한다. 

출처: 쉬운코드

그렇다면 Functional dependency 를 어떻게 파악할 수 있을까요? 핵심은 같은 X에 대해서 여러개의 Y가 존재해서는 안됩니다.

  • 테이블의 스키마를 보고 의미적으로 파악해야 합니다.
  • 즉, 테이블의 state를 보고 FD 파악해서는 안됩니다.

이게 무슨 뜻이냐면, 다시 예를들어 EMPLOYEE table에는 다음과 같은 데이터들이 있다고 가정했을 때 empl_name과 birth_date이 1:1로 맵핑되는 것처럼 보여서 이 두 attributes 사이에도 FD가 존재하는 구나라고 착각할 수 있습니다. 왜냐하면 empl_name에는 '동명인'이 존재할 수 있기 때문입니다. 그래서 테이블의 특정 순간의 특정 상태(state)만 보고 {empl_name} -> {birth_date}가 존재한다고 생각하면 안됩니다.

출처: 쉬운코드
출처: 쉬운코드

그래서 이런 경우에는 FD가 성립하지 못합니다. 즉 성립하기 위해서는 empl_name이 같다면 생일이 같아야하는데 이름은 같지만 생일이 다르기 때문입니다. 따라서 특정 순간의 상태가 아니라 테이블의 스키마를 보고 의미적으로 FD가 존재하는지 파악해야합니다.

그렇기 때문에 구축하려는 DB의 attributes가 관계적으로 어떤 의미를 지닐지에 따라 FD들이 달라집니다.

출처: 쉬운코드

다음 예시에서는 {stu_id, class_id} -> {grade}는 stu_id, class_id가 함께 있을 때 grade를 결정합니다. 또한 {bank_name, bank_account} -> {balance, open_date} 여기서 bank_account 만으로 결정할 수 없는 이유는 다른 은행에서 같은 계좌를 사용할 수 있기 때문입니다.

출처: 쉬운코드

그래서 X -> Y라고 해서 Y -> X라 할 수 없고, 또 Y -> X 가 아니라고도 할 수 없는 경우가 있다. 

출처: 쉬운코드

예를들어, empl_id 는 empl_name을 결정합니다. 왜냐하면 empl_id는 고유하기 때문입니다. 하지만 반대로 empl_name은 empl_id를 결정하지 못합니다. 왜냐하면 동명인이 존재할 수 있기 때문입니다. 또한 empl_id는 SSN을 결정합니다. 마찬가지로 주민등록번호인 SSN도 empl_id를 결정합니다.

출처: 쉬운코드

공집합이 Y집합을 결정한다? 즉 Y값은 언제나 하나의 값을 갖는다는 뜻입니다. 다음 예시에서 company에는 계속 ez.만 사용한다고 했을 때 어떤 상황에서도 단 하나의 값만을 갖기 때문에 특정 attribute에 따라서 값이 변하는 것이 아니라 언제나 항상 하나로 유지된다.

출처: 쉬운코드

functional dependency의 종류

1. Trivial functional dependency

X가 Y를 결정함과 동시에 Y가 X의 부분집합이라면 이를 trivial 함수 종속이라고 합니다.

출처: 쉬운코드

2. Non-trivial functional dependency

X가 Y를 결정하지만 Y는 X의 부분집합이 아닐 때 이를non-trivial 함수 종속이라고 합니다. 주의할 사항은 겹치는 요소가 있기는 하지만 Y집합이 X집합의 부분집합이 아니어야한다. 그런데 만약 겹치는 요소가 하나도 없다면 이는 non-trivial 함수 종속 임과 동시에 completely non-trivial FD 입니다.

출처: 쉬운코드

3. Partial functional dependency

X가 Y를 결정함과 동시에 X의 any proper subset 인 X' 가 Y를 결정할 수 있을 때 이를 partial FD라고 합니다.

출처: 쉬운코드

그래서 이 proper subset 중 어떤 하나라도 이 Y를 결정할 수 있을 때, 이를 partial FD라고 합니다. 다음 예시에서 {empl_id, empl_name} 이 함께 있을 때 {birth_date}를 결정합니다. 그러나 empl_id 혼자서도 즉 이 proper subset은 birth_date를 결정할 수 있습니다. 그래서 이런 관계를 partial FD라고 합니다.

출처: 쉬운코드

4. Full functional dependency

partial FD가 아닌것을 Full fuctional dependency라고 합니다. 즉, X가 Y를 결정함과 동시에 X의 어떠한 proper subset도 Y를 결정할 수 없다면 이를 Full FD라고 합니다. 다음예시에서 stu_id, class_id 가 함께 있을 때, 즉 두 개가 같다면 grade는 같다고 할 수 있습니다. 하지만 함께 있지 않고 따로 있다면 grade는 다를 수 있습니다. 왜냐하면 한 학생마다 듣는 class는 여러개 일 수 있고 또 class마다 학생은 여러명 이기 때문입니다.

출처: 쉬운코드

이번시간에는 Functional dependency에 대해서 배워보았습니다. 다음시간에는 FD를 사용해서 DB를 정규화 하는 방법에 대해서 배워보도록 하겠습니다.

  • trivial FD
  • non-trivial FD, completely non-trivial
  • partial FD
  • full FD
728x90