정규화(Normalization)란?
정규화란, 각각의 엔터티가 하나의 릴레이션에 의해 표현된다라는 것을 보장하는
규칙적인 수학적 과정을 말한다.
정규화된 데이터베이스인 경우에는 데이터를 변경하더라도 논리적인 문제가 발생하지 않으며,
완벽성을 손상시키지 않고서도 데이터 중복을 최소한으로 유지할 수 있다.
정규화에는 대표적으로 1 정규화, 2 정규화, 3 정규화가 존재한다.
제 1 정규화
- 릴레이션(테이블)의 튜플(행)은 반드시 고유해야 한다.
- 모든 특성들은 더 이상 분해할 수 없는 원자적이어야 한다.
- 쉽게 생각하면 기본키의 특성을 갖는 속성이 있어야 한다.
위의 1 정규화의 정의는 릴레이션에 대한 반복적인 정의라고 볼 수 있다.
즉, 테이블이 진정한 릴레이션이 되려면,
이미 해당 테이블은 1 정규화가 반드시 되어 있어야만 한다.
만약, 어떤 특성이 애플리케이션에서 필요로 하는 만큼 충분하게 쪼개져 있지 않다면,
그 특성 역시 더 쪼개질 수 있는 가능성이 있다.
예를 들어, 주소라는 특성이 특정 애플리케이션에서 봤을 때에는
충분히 원자적이라고 판단되더라도,
주소에 도시 이름을 포함하지 않다는 점으로 인해 1 정규화를 위반한다고 판단될 수도 있다.
즉, 어떤 애플리케이션이냐에 따라 1정규화를 만족했다고도,
만족하지 못했다고도 할 수 있다.
위의 테이블을 1정규화를 만족시키도록 수정해보자.
지금 테이블에서는 학번으로만 기본키를 설정하여 릴레이션의 튜플을 고유하게 만들고 싶지만,
현재 상태에서는 튜플들이 고유하다고 말할 수 없다.
(기본키인 학번이 고유하지 않으므로)
위와 같이 테이블을 분해하면 [학생] 테이블의 튜플들은 고유성을 가지고 있다고 할 수 있다.
하지만, [수강내역] 릴레이션의 튜플은 아직은 고유성을 가지고 있다고 보기 힘들다.
즉, 수강내역 테이블의 식별자 역할을 수행하기 위해서는
학번 + 수강 학기 + 과목명을 기본키로 정해주면 된다.
제 2 정규화
- 데이터는 반드시 1 정규화를 충족해야 한다.
- 기본키가 아닌 속성들이 모두 기본키에 완전함수종속 되어야 한다.
[수강내역] 테이블을 보면, 제한 인원 속성은 수강 학기와 과목명에 부분 함수 종속되고,
기본키로 정한 (학번, 수강 학기, 과목명)에 완전 함수 종속되지는 않는다.
즉, 기본키가 아닌 속성들이 기본키에 완전 함수 종속되지 않으므로,
2 정규화를 만족하지 못하는 릴레이션이라고 볼 수 있다.
위와 같이 [수강내역]을 다시 한번 쪼개게 되면,
이때는 [수강내역] , [개설과목] 릴레이션 모두 기본키가 아닌 속성들이 모두
기본키에 완전 함수 종속되는 걸 알 수 있다.
즉, 위 릴레이션들은 2 정규화를 만족한다.
제3 정규화
- 데이터는 반드시 2 정규화를 충족해야 한다.
- 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않아야 한다.
위와 같이 2정규화를 만족한 학생 테이블을 확인해보자.
위의 관계도를 본다면, [학번 → 전공] ∧ [전공 → 대학] 즉, [학번 → 대학]이라는
이행적 함수적 종속성이 발생하게 된다.
이행적 함수적 종속성이 발생하게 되면,
3 정규화를 만족시킬 수 없으므로 해당 이행적 함수적 종속성을 제거해야 한다.
즉, 대학과 전공을 따로 테이블로 생성해서 [대학 정보]라는 테이블을 만들어주어
해당 문제를 해결할 수 있다.
학생 릴레이션과 대학정보 릴레이션 모두 이행적 함수적 종속성이 없어진 걸 볼 수 있다.
즉, 해당 릴레이션은 제3정규화를 만족하는 릴레이션이다.
최종적으로 제3 정규화까지 마친 릴레이션은 아래와 같다.
'DB ARCHITECTURE' 카테고리의 다른 글
SQL-SERVER SCHEDULER : sqlserver 스케쥴러(2) (7) | 2021.12.15 |
---|---|
SQL-SERVER SCHEDULER : sqlserver 스케쥴러(1) (0) | 2021.12.15 |
SQL-SERVER SCHEDULER : 윈도우 스케쥴러 (0) | 2021.12.15 |
함수적 종속 (0) | 2021.07.30 |
제약조건(Constraint) 이란 (0) | 2021.07.29 |