일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- BFS
- 완전탐색
- 코딩테스트준비
- DP
- 데이터베이스
- 개발자취업
- 트리
- 그래프
- 항해99
- Til
- 그래프 이론
- Java
- BinarySearch
- 백준
- 자바
- 우선순위큐
- 정렬
- DFS
- lower bound
- 네트워크 계층
- 백트래킹
- 99클럽
- 알고리즘
- 스프링
- 동적 프로그래밍
- 그리디
- Spring
- 스프링 핵심 원리 - 기본편
- 프로그래머스
- 브루트포스
- Today
- Total
AtraFelis's Develop Diary
[DataBase] 함수 종속과 정규화 본문
정규화란 이상 현상이 발생하지 않도록, 릴레이션을 분해하는 과정이다. 데이터베이스의 이상현상에 관해서는 이전 글에서 다룬 바 있으므로 궁금하다면 그 글을 참고하길 바란다.
정규화는 릴레이션을 분해하는 과정이라고 말했다. 그렇다면 어떤 기준에 의해서 릴레이션을 분해하는 기준도 분명히 있을 것이다. 아무렇게나 릴레이션을 쪼갠다고 이상 현상이 해결되지는 않을 것이니까.
이 정규화를 수행하는 기준이 바로 함수적 종속성이다.
함수 종속
함수 종속(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 | 물리학과 | 정교수 |
이렇게 위 릴레이션에서 학과 정보만 따로 분리하면 이행 함수 중복을 제거할 수 있다.
'DataBase' 카테고리의 다른 글
[DataBase] 데이터베이스의 이상 현상(Anomaly) (0) | 2024.12.02 |
---|---|
E-R모델을 이용한 관계 데이터베이스 설계 방법 (0) | 2024.11.27 |
[SQL] SELECT로 데이터 출력하기 (0) | 2024.11.18 |
[DataBase] 인덱스(index)란? (0) | 2024.09.04 |
[데이터베이스] 관계형 DB vs 비관계형 DB (0) | 2024.05.18 |