| 학생이름 | 강의 |
|---|---|
| 홍길동 | 수학, 영어 |
| 이순신 | 수학, 과학 |
위와 같은 테이블이 있다고 가정해보자. 위 테이블에서 홍길동 이라는 학생이 수강한 강의는 수학, 영어 두가지 값을 갖기 때문에 원자성을 갖지 않는다.
원자성이란? 더이상 나눌 수 없는 값을 의미한다. 즉, 하나의 데이터만을 갖는 것을 뜻한다.
제1 정규화는 '각 로우마다 컬럼의 값이 원자 값을 가져야 한다'는 것을 명시하는 규칙이다. 따라서 위 테이블을 제1 정규화를 만족하도록 한다면 각 로우마다 하나의 강의를 가지도록 변경할 수 있다.
| 학생이름 | 강의 |
|---|---|
| 홍길동 | 수학 |
| 홍길동 | 영어 |
| 이순신 | 수학 |
| 이순신 | 과학 |
| 학생이름 (PK1) | 강의 (PK2) | 강의실 |
|---|---|---|
| 홍길동 | 수학 | 301호 |
| 홍길동 | 영어 | 201호 |
| 이순신 | 수학 | 301호 |
| 이순신 | 과학 | 101호 |
위와 같은 테이블이 있다고 가정해보자. 학생이름과 강의는 복합키이다. 이때, 강의실은 학생이름이 아닌 강의에 종속되어있다.
제2 정규화는 '테이블의 모든 컬럼이 기본 키에 완전히 함수적으로 종속되어야 한다'는 규칙이다. 따라서, 위 테이블은 제2 정규화에 위반되는 테이블이다. 이를 제2 정규화에 만족하도록 한다면 아래와 같이 강의와 강의실을 분리하여 테이블을 만들 수 있다.
| 학생이름 | 강의 |
|---|---|
| 홍길동 | 수학 |
| 홍길동 | 영어 |
| 이순신 | 수학 |
| 이순신 | 과학 |
| 강의 | 강의실 |
|---|---|
| 수학 | 301호 |
| 영어 | 201호 |
| 수학 | 301호 |
| 과학 | 101호 |
| 직원ID(PK) | 직원명 | 부서ID(FK) | 부서명 |
|---|---|---|---|
| 1 | 홍길동 | 10 | 영업부 |
| 2 | 이순신 | 20 | 개발부 |
| 3 | 임꺽정 | 10 | 영업부 |
| 4 | 강감찬 | 30 | 인사부 |
위와 같은 테이블이 있다고 가정해보자. 기본키를 제외한 나머지 컬럼은 모두 기본키에 종속되어있다. 그러나, 해당 테이블에는 부서ID -> 부서명 이라는 종속 관계도 가지고 있다.
제3 정규화는 테이블 내 모든 컬럼은 이행적 종속 관계를 가지지 않는다는 규칙이다.
이행적 종속 관계란? A -> B, B -> C 종속 관계에서 유도되는 A -> C 종속관계를 의미한다. 위 테이블에서는
직원ID->부서ID,부서ID->부서명이라는 종속관계를 통해직원ID->부서명이라는 이행적 종속 관계가 형성된다.
이를 해결하기 위해선 테이블을 분리할 필요가 있다. 부서 정보를 갖는 테이블을 따로 분리하면 다음과 같이 분리할 수 있다.
직원 테이블
직원ID | 직원명 | 부서ID
-- | -- | --
1 | 홍길동 | 10
2 | 이순신 | 20
3 | 임꺽정 | 10
4 | 강감찬 | 30
부서 테이블
부서ID | 부서명
-- | --
10 | 영업부
20 | 개발부
30 | 인사부
종종 제2 정규화와 제3 정규화를 헷갈리는 경우가 있는데, 궁극적인 차이점은 "어떤 종류의 함수적 종속성을 제거하느냐"에 있다.
제2 정규화는 "부분 함수적 종속"을 제거하는 것이 목표다. 따라서 제2 정규화는 복합 키를 가진 테이블에서만 적용된다.
부분 함수적 종속이란, 복합 키의 일부에만 종속되는 속성이다.
반면, 제3 정규화는 "이행적 함수적 종속"을 제거하는 것이 목표다. 제3 정규화는 이러한 이행적 함수적 종속을 제거하여, 모든 비키 속성이 기본 키에만 직접적으로 종속되도록 만든다.
결과적으로, 제2 정규화와 제3 정규화 모두 테이블을 분리하여 데이터의 중복을 최소화하고 무결성을 향상시키는 것이 공통 목표지만 어떤 종류의 함수적 종속을 제거하냐가 큰 차이라고 볼 수 있다.