함수 종속성 (functional dependency)
'데이터베이스의 릴레이션 R(테이블)에서 X와 Y를 R의 부분집합이라고 할 때, X의 값 각각에 대해 Y의 값이 오직 하나로
결정 될때 Y는 X에 종속 된다고 한다.'
위의 개념이 백과사전(위키백과)에 정의된 개념이다.
간단히 설명하면 테이블의 한 필드값(X)이 다른 필드값(Y)을 결정하는 관계를 함수 종속이라고 할 수 있고
이는 우리가 중고등학교 시절 배운 y=f(x)의 관계와 같다.
이때 X를 결정자라고 하며 Y를 종속자라고 한다.
정규화가 잘된 테이블일수록 결정자 X는 PK로 한개이고 종속자가 여러개인 구조를 가집니다.
X | Y1 | Y2 | Y3 | Y4 |
위처럼 X가 다른 모든 필드값을 결정하는
X -> Y1
X -> Y2
X -> Y3
X -> Y4 와 같은 관계를 띄게 됩니다.
위의 성격을 완전함수종속이라고도 합니다.
완전함수 종속
종속자가 기본키에만 종속되며, 기본키가 여러 속성으로 구성되어 있을 경우 기본키를 구성하는
모든 속성이 포함된 기본키의 부분집합에 종속된 경우를 완전함수 종속이라고 한다.
위의 테이블을 보자.
주민번호를 알면 이름, 성별 , 주소를 모두 식별할 수 있다.
허나 이름은 성별, 주소, 주민번호 어떤것도 식별 할 수 없다.
성춘향이라는 이름은 남자도 있고 여자도 있으며, 서울에 사는 사람도 있고, 부산에 사는 사람도 잇다.
주민번호도 엄연히 다르다.
이름으로 다른 속성을 결정할 수 없다.
성별도 마찬가지이다. 남자라고 해서 다 홍길동이 아니고 임꺽정도 있고 성춘향도 있다.
이러한 원리를 적용해보면 주민번호를 제외한 그 어떤 속성도 다른 속성을 결정할 수 없다.
위의 테이블은
주민번호(X) -> 이름(Y1)
주민번호(X) -> 성별(Y2)
주민번호(X) -> 주소(Y3)와 같은 관계가 성립하는
주민번호를 제외한 다른 속성들이 다른 속성에 종속되지 않는 완전 함수 종속이 이루어진 테이블이다.
부분함수 종속
릴레이션에서 기본키가 복합키일 경우 기본키를 구성하는 속성 중 일부에게 종속된 경우를 부분함수 종속이라고 한다.
위의 테이블에서 기본키는 (이름, 성별) 이다.
(이름,성별) -> 주소
(이름,성별) -> 지역번호
관계가 성립한다.
허나 이외의 관계도 성립한다.
기본키의 부분집합인 이름에 대해 (이름) -> (주소)의 관계가 성립한다.
이 경우가 기본키가 여러 속성으로 구성되어 있을경우 기본키를 구성하는 속성 중 일부에게 종속된 경우이다.
이행함수 종속
릴레이션에서 X, Y, Z라는 3 개의 속성이 있을 때 X→Y, Y→Z 이란 종속 관계가 있을 경우,
X→Z가 성립될 때 이행적 함수 종속이라고 합니다. 즉, X를 알면 Y를 알고 그를 통해 Z를 알 수 있는 경우를 말합니다.
위에서 예시를 든 테이블에서
X(이름, 성별) -> Y(주소)
X(이름,성별) -> Z(지역번호) 관계를 알았습니다.
그런데 Y(주소) -> Z(지역)의 관계도 성립합니다.
X -> Z의 관계에서 X에 의한 Z값의 결정은 X->Y->Z에 의해 결정된 관계입니다.
이러한 관계를 이행함수 종속이라고 합니다.
+추가적으로 잘못 설계된 테이블에서 나타날수 있는 이상현상에 대해 알아보겠습니다.
- 갱신이상 : 테이블에서 특정 속성값 갱신 시 중복 저장되어 있는 속성값 중 하나만 갱신하고,
나머지는 갱신하지않아서 발생하는 데이터의 불일치 현상
- 삭제이상 : 테이블에서 특정 행을 삭제할 경우 원하지 않은 정보까지도 삭제되는 현상
- 삽입이상 : 테이블에서 특정 행을 삽입할 경우 NULL 값이나 원하지 않은 불필요한 정보까지도 삽입해야 하는 현상
위의 테이블로 예시를 들어보겠습니다.
대수학 과목을 듣는 학번100 학생이 행정실에 찾아와 핸드폰 번호가 바뀌었다고 알려주었습니다.
그렇다면 우리는 수강과목='대수학' and 학번='100' 이라는 조건으로 핸드폰 번호를 바꿀 것입니다.
테이블에 중복여부가 있는지 모른채 개발을 한다면 이 학생은 해석학 수업과 정수론 수업에 등록된 정보와
다르게 저장될 것입니다.
나중에 학번으로 핸드폰 번호를 조회했는데 핸드폰 번호가 두개가 나오는 이상한 결과가 나올 수도 있습니다.
위와 같은 현상을 갱신이상이라고 합니다.
DB 과목을 듣는 학번 500 학생이 성적이 낮게 나와 행정실에서 수강삭제를 요청했습니다.
행정실에서는 이 학생의 수강정보를 삭제합니다. 허나 여기에서 학생의 학번과 핸드폰번호, 학과와 같은
중요한 정보까지 삭제됩니다.
원치 않는 정보까지 삭제되는 현상을 삭제이상이라고 하죠.
건축과에 신입생이 들어왔습니다.
학번은 600, 핸드폰번호는 01060001234입니다. 허나 아직 신입생이기에 수강신청을 하지 않아
수강내역이 없습니다.
이런경우 신입생의 정보를 넣기 위해 수강과목, 지도교수, 성적 칼럼에 NULL값을 넣거나
값이 비어있다는걸 알 수 있게 설계자가 고안한 상태코드 값을 넣어주어야 합니다.
이렇게 NULL 값이나 불필요한 정보를 넣어주게 되는 현상을 삽입 이상이라고 합니다.
그렇다면 위에서 나타난 이상현상이 안나타나게 하려면 어떻게 테이블을 짜야할까요.
아마 위와 같이 테이블을 설계한다면 적어도 위에서 설명한 이상현상은 안 나타나지 않을까 싶습니다.
함수종속성이나 이상현상에 대해 부족한 부분이나 더 좋은 의견이 있으시면
댓글을 달아주세요.
좋은 의견은 서로 공유했으면 좋겠네요~
'DB' 카테고리의 다른 글
git 명령프롬프트를 통한 사용법(git 명령어 사용법) (0) | 2020.10.29 |
---|---|
이클립스 프로젝트와 깃허브(github) 연동방법 (0) | 2020.10.27 |
데이터베이스 정규화(1차, 2차, 3차, BCNF 정규화) (0) | 2020.09.30 |
[Database] 키의 개념과 구분(슈퍼키, 후보키, 기본키, 대체키, 외래키) (0) | 2020.09.29 |
mysql workbench 설치 및 사용법(오류해결 mysql 5.*버전 사용자) (0) | 2020.09.12 |