전성빈의 사리사욕
[Normalization/정규화] 함수 종속성이란? 본문
- 함수 종속성이란?
- 완전 함수 종속 (Full Functional Dependency)
- 부분 함수 종속 (Partial Functional Dependency)
- 이행적 종속 (transitive Dependency)
함수 종속성이란?
함수 종속성은 DB에서 속성들간 종속 관계를 말합니다.
우리가 테이블의 필드들의 종속 관계를 알아야하는 이유는 불필요한 데이터 중복을 줄이고 더욱 논리적으로 만들 수 있게 해줍니다. 즉, 데이터 베이스 정규화에 필요한 개념입니다.
데이터 베이스에서의 함수 종속성을 정의하는 말은 다음과 같습니다.
어떤 테이블 R에 존재하는 필드들의 부분 집합을 각각 X와 Y라고 할 때, X의 한 값이 Y에 속한 하나의 값에만 매핑 될 경우 Y는 X에 함수 종속적이다 라고 하며 X -> Y라고 표기합니다.
여기서 X를 "결정자"라고 부르며 Y를 "종속자"라고 부릅니다.
이러한 함수적 종속은 관계에 따라 크게 3가지 종류가 있습니다. 하나씩 알아보도록 하겠습니다.
완전 함수 종속 (Full Functional Dependency)
완전 함수 종속이란, 기본키가 종속자이며 기본키가 여러 속성으로 구성되어 있을 경우 기본키를 구성하는 모든 속성이 포함된 부분집합 또한 종속자일 경우를 말합니다.
예제 테이블 :
학번 | 학부 | 이름 |
001 | 컴퓨터 공학과 | 홍길동 |
002 | 컴퓨터 공학과 | 이순신 |
003 | 전자공학과 | 장보고 |
위와 같은 릴레이션은 학부와 이름이 학번에 종속되어 있습니다. 따라서 이러한 관계를 가집니다.
결정자 : 학번
종속자 : 학부, 이름
candidate key : {학번}
non-prime attribute : 학부, 이름
종속 관계 : {학번 -> 학부, 이름}
이러한 관계에서 종속자는 기본키이며 기본키를 구성하는 모든 속성의 부분집합이 종속자이기 때문에 "학부와 이름은 학번에 완전 함수 종속 되어있다." 라고 말합니다.
다음 예제 테이블을 봅시다.
예제 테이블 :
고객_id | 상품_id | 주문상품 | 수량 | 가격 |
001 | AAA | 베개 | 2 | 10000 |
001 | AAB | 이불 | 1 | 35000 |
002 | AAB | 이불 | 1 | 35000 |
003 | AAB | 이불 | 2 | 70000 |
결정자 : 고객_id, 상품_id
종속자 : 주문상품, 수량, 가격
candidate key : {고객_id, 상품_id}
non-prime attribute : 주문상품, 수량, 가격
종속관계 : {고객_id, 상품_id -> 수량}
{상품_id -> 주문상품}
{고객_id, 상품_id, 수량 -> 가격}
위와 같은 테이블은 수량이 고객_id와 상품_id에 종속되어 있어 해당 관계는 "완전 함수 종속되어 있다"라고 말합니다.
하지만 "주문상품"이나 "가격"은 기본키를 구성하는 모든 구성요소에 대해 종속되어 있지 않습니다. 따라서 완전 함수 종속되어 있지 않습니다. 그럼 이러한 것들은 어떤 관계일까요?
부분 함수 종속(Partial Functional Dependency)
부분 함수 종속이란, 릴레이션에서 종속자가 기본키가 아닌 다른 속성에 종속되거나, 기본키를 구성하는 여러 속성들의 부분집합 중 일부분에만 종속되어 있음을 말합니다.
위 테이블에서 "주문 상품"은 기본 키를 구성하는 속성들의 부분집합중 일부분에만 종속되어 있습니다. 따라서 주문 상품 속성은 "부분 함수 종속 되어있다."라고 말합니다.
"가격" 속성은 기본키인 {고객_id, 상품_id}와 더불어 기본키가 아닌 속성인 "수량"에도 종속되어 있기 때문에 부분 함수 종속 되어있다 말할 수 있습니다.
이러한 관계들은 논리적으로 자연스럽지 않으며 개선할 점이 보입니다. 그리고 부분 함수 종속 말고도 하나의 불안전한 함수 종속성이 있습니다.
이행적 종속(Transitive Dependency)
X,Y,Z라는 3가지 부분집합을 가진 릴레이션에서 {X -> Y}이고 {Y -> Z}일때 {Y -> X}가 아니라면 암스트롱의 공리에 의해 {X->Z}입니다. 이를 "X는 Z의 이행적 종속이다." 혹은 "Z는 X에 이행적 종속되어있다." 라고 말합니다.
위 테이블에서 가격의 종속 관계는 {고객_id, 상품_id, 수량 -> 가격} 이러한 형태를 가집니다.
수량은 {고객_id, 상품_id -> 수량} 이러한 형태를 가지니 {고객_id, 상품_id -> 수량 -> 가격} 이러한 관계라고 볼 수 있습니다. 또한 {수량 -> 고객_id, 상품_id}가 아니기 때문에 "가격"은 {고객_id, 상품_id} 이행적 종속되어 있다. 라고 말합니다.
이러한 관계 또한 논리적으로 부자연스럽기 때문에 우리는 부분 함수 종속과 이행 함수종속을 제거해 주며 테이블을 논리적이고 효율적으로 만들어 데이터베이스를 정규화 시킵니다.
출처 :
'백엔드 로드맵따라가기 > DB 상세정보' 카테고리의 다른 글
[Normalization/정규화] 데이터 베이스 정규화 (0) | 2020.11.30 |
---|---|
Indexes and how they work (0) | 2020.11.10 |
N + 1 Problem (0) | 2020.11.10 |
SQL/PSM (0) | 2020.11.10 |
Transaction Management 공부할것 (0) | 2020.11.10 |