우리 말로 함수 종속성이라고 합니다.
functional dependency란 한 테이블에 있는 두 개의 attribute(s) 집합(set) 사이의 제약(a constraint)입니다.
EMPLOYEE
empl_id | emple_name | birth_date | position | salary | dept_id |
---|
이 테이블에서 두 개의 attribute 집합을 골라보겠습니다.
X = {empl_id}
Y = {emple_name, birth_date, position, salary}
이 두 attribute 집합 사이에는 하나의 특징이 있습니다.
EMPLOYEE 테이블에서 어떠한 두 tuple을 골랐을 때 만약 두 tuple의 X 값이 같다면 두 tuple의 Y값 또한 같을 것입니다.
(여기서 함수적 종속성이라는 의미를 파악할 수 있습니다. 수학에서 함수가 존재할 때 input이 같으면 output값도 항상 동일하기 때문에 functional 이라는 의미가 붙었다고 볼 수 있습니다.)
당연하게도 empl_id는 직원들을 구별할 수 있는 유일한 값이며 pk이기 때문입니다.
결론적으로, X 값에 따라 Y값이 유일하게 결정되고 이를 집합 X가 집합 Y를 함수적으로 결정한다(functionally determine)고 말할 수 있습니다. (X -> Y)
또한 Y가 X에 함수적으로 의존한다(funtionally dependent)라고도 말할 수 있으며, 두 집합 사이의 이러한 제약 관계를 FD(functional dependency)라고 부릅니다.
X -> Y에서 X는 left-hand, Y는 right-hand라고 합니다.
테이블의 스키마를 보고 의미적으로 함수 종속성을 찾아야 합니다.
테이블의 state를 보고 FD를 찾아서는 안됩니다.
empl_id | empl_name | birth_date | position | salary | dept_id |
---|---|---|---|---|---|
... | 짱구 | 1995-09-01 | ... | ... | ... |
철수 | 1995-09-02 | ||||
유리 | 1995-09-03 | ||||
훈이 | 1995-09-04 |
테이블이 다음과 같다고 할 때 지금 보면 이름이 다르면 생일이 다릅니다. 그래서 "이름이 다르면 생일도 다르네? 그러니까 {empl_name} -> {birth_date} 함수적으로 결정한다." 이렇게 생각할 수 있습니다.
하지만 상식적으로 말이 안 됩니다. 여기에 동명 이인이 있을 수도 있거든요. 이름이 짱구라는 직원이데 생년월일이 1995-09-05인 직원이 있을 수 있습니다.
이러면 이름은 같은데 생년월일이 다른 경우가 발생하겠죠. 위 두 attribute 집합이 함수 종속성을 가지지 않는 것이 됩니다.
결론적으로 이렇게 테이블의 특정 순간의 상태(state)만 보고 함수적 종속성을 판단해서는 안되며,
구축하려는 DB의 attribute들이 관계적으로 어떤 의미를 가지는지 혹은 attribute 간의 어떤 정책을 가지기로 약속했는지에 따라서 같은 테이블 스키마여도 FD는 달라질 수 있습니다.
위 테이블에서는 {emple_id} -> {empl_name, birth_date, position, salary} 의 함수 종속성이 있습니다.
여기서 dept_id는 뺐는데 이것으로 정책에 관해 예를 들겠습니다.
만약 회사 정책에 한 명의 직원은 한 부서에만 속한다고 한다면 위 함수 종속성의 right-hand에 dept_id까지 포함될 수 있습니다.
하지만 한 명의 직원이 여러 부서에 속할 수 있다고 한다면 right-hand에 dept_id가 포함될 수 없습니다.
이처럼 테이블 스키마를 보고 의미적으로 또 어떤 정책을 가지는 지에 따라 함수 종속성을 판단해야 합니다.
X->Y의 함수 종속성이 존재할 때, X->Y이면 Y->X는 아닐 수 있습니다.
만약 {empl_id} -> {empl_name}의 함수 종속성이 존재하지만 {empl_name} -> {emple_id}의 함수 종속성은 존재하지 않습니다.
하지만 X->Y일 때 Y->X인 경우도 있습니다.
{empl_id} -> {SSN}(주민번호) 일 때 {SSN} -> {empl_id}는 성립됩니다.
X->Y의 함수 종속성이 있을 때 Y가 X의 부분 집합인 경우
{a,b,c} -> {c}
X->Y의 함수 종속성이 있을 때 Y가 X의 부분 집합이 아닌 경우
{a,b,c} -> {b,d}
X->Y의 함수 종속성이 있을 때 Y가 X의 부분 집합이 아니며, Y의 원소가 X의 원소와 하나도 겹치지 않는 경우
{a,b,c} -> {d}
X->Y의 함수 종속성이 있을 때 X의 진 부분집합 X' 중 어느 하나라도 또한 X'->Y의 함수 종속성을 가지는 경우
{a,b,c} -> {b,d}일 때 {a,c} -> {b,d}
X->Y의 함수 종속성이 있을 때 X의 진 부분집합 X' 중 그 어떤 것도 X'->Y의 함수 종속성을 가지지 못하는 경우
즉, X->Y일 때 X의 원소 중 어떤 것을 제거했을 때 X'->Y가 성립하면 Partial FD, 아니라면 Full FD입니다.
Y의 값이 언제나 하나인 경우
FD는 X->Y라고 표현하며 "X의 값이 같은 때 Y의 값도 무조건 같다" 라는 의미입니다.
따라서 X가 Y를 유니크하게 식별할 수 있습니다.
이러한 함수 종속성은 테이블 스키마를 보고 의미적, 정책적으로 파악하여야 하며, 함수 종속성에는 여러 종류가 있습니다.
다음 포스팅에서는 정규화에 대해 알아보겠습니다.