정규화의 목표는 중복되는 데이터를 최소화하여 데이터베이스의 용량을 최소하하고 효율성을 높이는 것이다.
중복을 피하기 위하여 데이터를 구조화하여 더 작은 테이블에 분해하는데 이를 구조화하는 정규화 단계가 정의되어 있다.
제 1 정규화는 컬럼이 원자값을 갖도록 분해하는 과정이다.(Automic Value)
학생명 | 수강과목 |
---|---|
이민수 | 수학, 영어 |
김민아 | 과학 |
박지우 | 국어, 과학 |
우준식 | 영어 |
위의 테이블에서는 민수와 지우는 수강과목이 여러개이다.
이러한 테이블은 제 1 정규형을 만족하지 못한다.
학생명 | 수강과목 |
---|---|
이민수 | 수학 |
이민수 | 영어 |
김민아 | 과학 |
박지우 | 국어 |
박지우 | 과학 |
우준식 | 영어 |
위와 같이 작성하면 제 1 정규형에 맞춰 작성할 수 있다.
제 2 정규화는 제 1 정규화를 완료한 테이블을 완전 함수 종속을 갖도록 하는 과정이다.
완전 함수 종속 ?
a 값에 따라 b의 값이 결정 될 때 b는 a에 대해 함수적 종속이라고 한다.
a가 하나의 값이 아닌 a1, a2라고 할 때 a1과 a2가 모두 b의 값을 결정하면 완전 함수적 종속이라고 한다. 그러나 a1, a2 둘 중에 하나만 b의 값을 결정하면 부분 함수적 종속이라고 한다.
학생번호 | 수강과목 | 강사명 | 점수 |
---|---|---|---|
001 | 수학 | 김수학 | 85 |
001 | 영어 | 이영어 | 83 |
002 | 과학 | 박과학 | 92 |
003 | 국어 | 임국어 | 79 |
003 | 과학 | 박과학 | 88 |
004 | 영어 | 이영어 | 86 |
위와 같은 기본키가 학생번호와 수강과목로 복합키인 테이블이 있을 때,
학생번호와 수강과목은 점수가 결정하고 있다.
하지만 강사명은 기본키의 부분인 수강과목으로만 결정되고 있기 때문에 제 2 정규형을 만족하지 못한다.
학생번호 | 수강과목 | 점수 |
---|---|---|
001 | 수학 | 85 |
001 | 영어 | 83 |
002 | 과학 | 92 |
003 | 국어 | 79 |
003 | 과학 | 88 |
004 | 영어 | 86 |
수강과목 | 강사명 |
---|---|
수학 | 김수학 |
영어 | 이영어 |
과학 | 박과학 |
국어 | 임국어 |
위와 같이 작성하면 제 2 정규형에 맞춰 작성할 수 있다.
제 3 정규화는 제 2 정규화를 완료한 테이블에서 이행적 종속을 없애는 단계이다.
이행적 종속?
이행적 종속이란 a -> b, b -> c 가 성립할 때, a -> c가 성립하는 것
학생번호 | 수강과목 | 총 강의 수 |
---|---|---|
001 | 수학 | 3회 |
001 | 영어 | 4회 |
002 | 과학 | 1회 |
003 | 국어 | 5회 |
003 | 과학 | 1회 |
004 | 영어 | 4회 |
이 테이블은 학생번호가 수강과목을, 수강과목은 총 강의 수를 결정하고 있다.
그러므로 [학생번호와 수강과목], [수강과목과 총 강의 수]로 테이블을 나눠야 한다.
그 이유로 003 학생이 수강과목을 국어로 변경한다면 총 강의 수는 1회인 국어 과목이 되어버린다.
물론 과목을 변경할때마다 총 강의 수도 바꿔줄 수 있지만,
이러한 번거로움을 해결하기 위해 제 3 정규화를 해야한다.
학생번호 | 수강과목 |
---|---|
001 | 수학 |
001 | 영어 |
002 | 과학 |
003 | 국어 |
003 | 과학 |
004 | 영어 |
수강과목 | 총 강의 수 |
---|---|
수학 | 3회 |
영어 | 4회 |
과학 | 1회 |
국어 | 5회 |
위와 같이 작성하면 제 3 정규형에 맞춰 작성할 수 있다.
학생번호 | 학생명 | 수강과목 | 과목코드 | 이메일 |
---|---|---|---|---|
001 | 이민수 | 수학 | A1 | minsu@naver.com |
001 | 이민수 | 국어 | A4 | minsu@naver.com |
002 | 김민아 | 과학 | A3 | m1na@gmail.com |
003 | 박지우 | 국어 | A4 | batwoo@naver.com |
003 | 박지우 | 과학 | A3 | batwoo@naver.com |
004 | 우준식 | 영어 | A2 | wooeat@gmail.com |
위의 테이블로 3가지 이상현상을 알아보자.
1. 삽입 이상
: 자료를 추가할 때 의도하지 않은 자료까지 추가해야하는 현상
005번호의 임성진이라는 학생을 새로 전학을 왔는데 아직 수강 과목이 없다고 한다.
이런 상황일 때 테이블에 수강과목과 과목코드, 점수는 null이 들어가야하는 문제가 발생한다.
2. 갱신 이상
: 중복된 데이터의 일부만 수정되어 모순이 되어버리는 현상
강의코드가 A1인 이민수의 이메일을 'strongminsu@naver.com'으로 수정한다.
이런 상황일 때 1번 row와 2번 row의 이민수는 같은 학생이지만 다른 이메일 정보를 갖게 된다.
3. 삭제 이상
: 어떤 정보를 삭제할 때 다른 정보까지 삭제되어버리는 현상
A2 코드를 가진 과목을 삭제한다.
이런 상황일 때 004번호의 우준식 학생의 데이터까지 삭제 되어버린다.