관계형 데이터 모델링의 핵심은 정규화이다. 정규화(Normalizaiton)는 속성(attribute)간의 부정확한 종속성(dependency)를 없애는 것을 의미한다. 더 풀어서 설명하면 함수 종속성(Functional dependency)이 없는 독립적인 속성들을 분리하는 것이다.
여기서 함수 종속성이 무엇인지 알려면 함수가 무엇인지 알아야 한다. 수학에서 함수의 정의는 두 변수 x, y에 대하여 x값이 정해짐에 따라 y값이 오직 하나만 결정될 때 y를 x의 함수라 한다.
이 변수의 입장을 릴레이션의 속성의 입장으로 확장시켜서 생각해본다. 릴레이션에서 A 속성의 값이 B속성의 값을 uique하게 식별할 수 있다면 B속성은 A속성에 함수적으로 종속됐다고 한다. 그리고 이러한 제약 관계를 Functional dependency라고 한다. 기호로는 A -> B로 나타낼 수 있다.
예를 들어, "상품" 테이블에서 상품번호, 상품명, 상품 가격, 카테고리명 속성을 가진다고 할 때, 상품번호에 따라 다른 칼럼들이 함수적으로 종속된다.
상품번호 -> (상품명, 상품 가격, 카테고리명)
함수 종속성은 완전 함수종속, 부분 함수종속, 이행적 함수종속으로 분류할 수 있다.
임의의 릴레이션 R에서 속성들의 집합 X에 대해 Y가 종속되나, X의 진부분집합(proper subset)에 대해서도 종속하는 경우, Y는 X에 대하여 부분 함수 종속성을 갖는다고 한다.
proper subset
집합 X의 proper subset이라하면 X의 부분집합이지만 X와 동일하지 않은 집합을 말한다.
쉬운코드 - DB에서 functional dependency(FD : 함수 종속)을 설명합니다!
위의 상품 테이블에서의 함수 종속성을 살펴보자.
{prod_id, prod_name} -> {prod_price}
위와 같은 함수적 종속이 존재할 때
{prod_id} -> {prod_price}
이 함수적 종속은 당연하게도 prod_id가 pk이기 때문에 만족하게 된다. 이 때, {prod_id, prod_name} -> {prod_price} 이 함수 종속을 부분 함수 종속(partial functional dependency)라 한다.
임의의 릴레이션 R에서 속성들의 집합 X에 대해 Y가 종속되나, X의 모든 진부분집합(proper subset)에 대해서는 함수적으로 종속되지 않는 경우, Y는 X에 대하여 완전 함수 종속성을 갖는다고 한다.
{order_id, prod_id} -> {order_qty}
주문 번호에 따라 혹은 상품 번호에 따라 주문 수량이 결정되지 않는다. 주문 번호, 상품 번호 조합에 주문 수량이 종속되므로 이 때, 주문 수량은 주문 번호, 상품 번호에 완전 함수 종속이 돤다.
함수 종속 관계 X -> Y와 Y -> Z가 성립되면 논리적으로 X -> Z가 성립한다. 이 때 속성 Z는 X에 대하여 이행적 함수적 종속성을 갖는다고 한다.
예를 들어, 주문 번호를 알면 회원 번호를 알 수 있고, 회원 번호를 알면 회원명을 알 수 있다. 그렇다면 주문 번호를 알면 회원명을 알 수 있는 것이므로 이 때 회원명은 주문 번호에 이행적 함수적 종속성을 갖는다고 한다.