AtraFelis's Develop Diary

[DataBase] 함수 종속과 정규화 본문

DataBase

[DataBase] 함수 종속과 정규화

AtraFelis 2024. 12. 9. 22:34

정규화란 이상 현상이 발생하지 않도록, 릴레이션을 분해하는 과정이다. 데이터베이스의 이상현상에 관해서는 이전 글에서 다룬 바 있으므로 궁금하다면 그 글을 참고하길 바란다.

정규화는 릴레이션을 분해하는 과정이라고 말했다. 그렇다면 어떤 기준에 의해서 릴레이션을 분해하는 기준도 분명히 있을 것이다. 아무렇게나 릴레이션을 쪼갠다고 이상 현상이 해결되지는 않을 것이니까.

이 정규화를 수행하는 기준이 바로 함수적 종속성이다.

함수 종속

함수 종속(Functional Dependency)란 데이터베이스 릴레이션에서 속성들 간의 관계를 나타내는 제약 조건으로, 특정한 속성이 다른 속성을 고유하게 결정하는 관계를 의미한다.

$$
X → Y
$$

X가 Y를 함수적으로 결정한다
Y가 X에 함수적으로 종속되어 있다.

 

여기서 $X$를 결정자(Determinant), $Y$를 종속자(Dependent)라고 한다.

다음과 같은 학생-강의 릴레이션이 존재한다고 가정하자. (이전 데이터베이스의 이상 현상 포스트에서 사용했던 예시 릴레이션이다.)

StudentID StudentName LectureID LectureName
S001 홍길동 L001 데이터베이스
S002 김영희 L002 운영체제
S003 이철수 L001 데이터베이스

기본키는 StudentID와 LectureID이다.

위 릴레이션에서는 StudentID → StudentName, LectureID → LectureName의 함수적 종속 관계를 찾을 수 있다. 학번이 주어지면 학생의 이름이 고유하게 결정되고, 강의 번호가 주어지면 강의 이름이 고유하게 결정되는 함수 종속 관계를 갖는다.

 

함수 종속의 종류

1. 완전 함수 종속 (FFD : Full Functional Dependency)

  • $X→Y$ : $Y$는 $X$에 종속된다.
  • $X^′⊂ X$에 대해서 $X^′↛ Y$ : $Y$는 $X$의 어떤 진부분집합에도 종속되지 않는다.

릴레이션에서 속성 집합 $Y$가 속성 집합 $X$에 함수적으로 종속되어 있지만, 속성 집합 $X$의 전체가 아닌 일부분에는 종속되지 않음을 의미한다. 즉, 종속자가 결정자의 일부가 아닌 전체에 의존하는 경우이다. 일반적으로 함수 종속이라 하면, 이 완전 함수 종속을 의미한다.

여기서 "속성 집합 $X$의 전체가 아닌 일부분에는 종속되지 않음을 의미한다"라는 말이 모호할 수 있다. 위 학생-강의 릴레이션수강 여부 속성을 추가한 예시를 살펴보자.

StudentID StudentName LectureID LectureName Attend
S001 홍길동 L001 데이터베이스 Y
S002 김영희 L002 운영체제 Y
S003 이철수 L001 데이터베이스 N

위 릴레이션에서 기본키는 $X = {StudentID, LectureID}$로 가정한다. 여기서 수강 여부를 나타내는 $Attend$ 속성은 $X$의 전체에 완전 함수 종속되어 있다고 할 수 있다. 학번만 보고 수강 여부를 알 수 없고, 강의 번호만 보고 수강 여부를 알 수 없으니까.

즉, 결정자의 일부인 학번이나 강의 번호만 보고 수강 여부를 알 수 없고 결정자 전체를 보아야 수강 여부를 알 수 있다. 이러한 경우를 완전 함수 종속이라고 한다.

 

2. 부분 함수 종속 (PFD : Partial Functional Dependency)

  • $X\rightarrow Y$ : $Y$가 $X$에 종속된다.
  • $X^′⊂ X$에 대해서 $X^′→Y$ 가 성립한다

릴레이션에서 속성 집합 $Y$가 속성 집합 $X$의 전체가 아닌 일부분에 함수적으로 종속됨을 의미한다. 위의 완점 함수 종속에 대해 잘 이해했다면, 부분 함수 종속은 쉽게 이해할 수 있다. 이 둘은 상호 베타적인 관계이기 때문이다.

또다시 위의 학생-강의 릴레이션을 살펴보자.

StudentID StudentName LectureID LectureName
S001 홍길동 L001 데이터베이스
S002 김영희 L002 운영체제
S003 이철수 L001 데이터베이스

결정자를 $X = {StudentID, LectureID}$, 종속자를 $Y = StudentName$이라고 하자. 여기서 종속자 $Y$는 결정자 $X$의 $StudentID$에는 종속적이지만, $LectureID$에는 종속되지 않는다. 학번이 학생의 이름을 결정하지만, 강의 번호가 학생의 이름을 결정하지는 않기 때문이다.

 

3. 이행 함수 종속 (*transitive FD)

  • $X→Y$ 그리고 $Y→Z$가 성립할 때, $Z$는 $X$를 통해 간접적으로 종속된다.

릴레이션을 구성하는 3개의 속성 집합 $X, Y, Z$에 대해 함수 종속 관계 $X → Y$ 와 $Y→Z$가 존재하면 논리적으로 $X→Z$가 성립한다. 이때 $Z$가 $X$에 이행적으로 함수 종속되었다고 한다.

StudentID StudentName DeptID DeptName DeptHead
S001 홍길동 D01 컴퓨터공학과 김교수
S002 김영희 D02 수학과 박교수
S003 이철수 D01 컴퓨터공학과 김교수
S004 최민수 D03 물리학과 정교수

위 릴레이션은 $StudentID→DeptID→DeptName,DeptHead$ 이런 종속 관계를 가진다. 이러한 경우 $DeptName,DeptHead$ 속성은 $StudentID$에 이행적으로 함수 종속되었다고 한다.

 

정규화 Normalization

함수 종속성을 이용해 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해해, 이상 현상이 발생하지 않게 하는 과정이다. 이때 릴레이션은 정규화로 인한 정보 손실이 발생하지 않아야 한다. 즉, 분해된 릴레이션들을 자연 조인 했을 때, 분해 전의 릴레이션으로 복원이 가능해야 한다.

정규형

릴레이션이 정규화된 정도를 의미한다. 차수가 높아질 수록 엄격해진다고 생각하면 된다.

제1 정규형 1NF : First Normal Form

릴레이션의 속성의 도메인이 더는 분해되지 않는 원자 값으로만 구성되어야 한다.

StudentID StudentName LectureID LectureName
S001 홍길동 L001, L003 데이터베이스, 객체지향프로그래밍
S002 김영희 L002, L003 운영체제, 객체지향프로그래밍
S003 이철수 L001 데이터베이스

이러한 경우는 제1 정규형을 만족하지 않는 릴레이션이다. $LectureID$와 $LecutreName$이 여러 개의 도메인으로 구성되어 있기 때문이다.

StudentID StudentName LectureID LectureName
S001 홍길동 L001 데이터베이스
S001 홍길동 L003 객체지향프로그래밍
S002 김영희 L002 운영체제
S002 김영희 L003 객체지향프로그래밍
S003 이철수 L001 데이터베이스

위 릴레이션에 제1 정규화를 진행하면 이런 형태의 릴레이션이 된다. 모든 도메인이 원자 값만을 가지는 것을 확인할 수 있다.

하지만 제1 정규화를 한다고 해서 이상현상이 사라지는 것은 아니다. 이상 현상의 발생 이유는 기본키인 $StudentID$와 $LectureID$에 완전 함수 종속되어 있지 않고, 부분 함수 종속된 속성들이 있기 때문이다.

이상 현상에 대해서는 이전 글을 참고하길 바란다.

이러한 부분 함수 종속으로 인해 생겨나는 이상 현상을 해결하기 위해 진행하는 것이 제2 정규화이다.

 

제2 정규형 2NF : Second Normal Form

제1 정규형까지 진행한 우리의 학생-강의 릴레이션의 문제는 릴레이션의 이름에서부터 나타나 있듯, 학생과 강의 속성이 같이 붙어 있어서 나타난다.

현재 릴레이션에 존재하는 부분 함수 종속은 다음과 같다.

  • $StudentID$ → $StudentName$
  • $LectureID$ → $LectureName$

이렇게 완전 함수 종속이 아닌 속성들을 각각 다른 릴레이션으로 이동하면 된다.

  • STUDENT(StudentID, StudentName)
StudentID StudentName
S001 홍길동
S001 홍길동
S002 김영희
S002 김영희
S003 이철수
  • LECTURE(LectureID, LectureName)
LectureID LectureName
L001 데이터베이스
L003 객체지향프로그래밍
L002 운영체제
L003 객체지향프로그래밍
L001 데이터베이스
  • ENROLLMENT (StudentID, LectureID)
StudentID LectureID
S001 L001
S001 L003
S002 L002
S002 L003
S003 L001

제2 정규화를 진행하면 이렇게 된다. STUDENT와 LECTURE 릴레이션까지는 예상했어도, ENROLLMENT 릴레이션은 생각하지 못할 수도 있다. 원래 릴레이션에는 어떤 학생이 어떤 과목을 수강하는지에 관한 정보도 포함하고 있었다는 것을 잊지 않아야 한다.

 

제3 정규형

제2 정규화까지 했지만, 이상 현상이 생기는 경우도 존재한다. 이는 이행적 함수 종속 때문으로, 이런 이행적 함수 종속을 제거하는 것이 제3 정규화이다.

이행적 함수 종속을 설명할때 사용했던 예시 릴레이션을 보자.

위 릴레이션은 이러한 이행적 함수 종속 관계를 가진다고 했다. 이때도 이상 현상이 발생할 수 있는데, 위 릴레이션에 S003 학생이 속한 학과의 학과장 교수($DeptHead$)가 바뀌어 릴레이션을 수정했다고 가정하자.

StudentID StudentName DeptID DeptName DeptHead
S001 홍길동 D01 컴퓨터공학과 김교수
S002 김영희 D02 수학과 박교수
S003 이철수 D01 컴퓨터공학과 심교수
S004 최민수 D03 물리학과 정교수
  •  $StudentID→DeptID→DeptName,DeptHead$

이럴 경우 갱신 이상이 발생한다. S001 학생과 S003 학생은 소속 학과 같으나 학과장 교수가 달라졌기 때문이다. 이러한 문제를 해결하기 위해 이행 함수 종속을 제거하는 제3 정규화를 진행한다.

StudentID StudentName DeptID
S001 홍길동 D01
S002 김영희 D02
S003 이철수 D01
S004 최민수 D03
DeptID DeptName DeptHead
D01 컴퓨터공학과 김교수
D02 수학과 박교수
D01 컴퓨터공학과 김교수
D03 물리학과 정교수

이렇게 위 릴레이션에서 학과 정보만 따로 분리하면 이행 함수 중복을 제거할 수 있다.