정규화
데이터베이스에 저장된 데이터들간 종속성을 분석하여 "1개의 종속성 : 1개의 릴레이션(aka 테이블)"으로 표현시키는 과정이다.
데이터베이스의 논리적 설계 후, 물리적 설계 이전에 정규화를 실행한다.
종속성) 사번을 통해 사원의 이름을 알 수 있고, 이름을 통해 주소를 알 수 있는 등의 관계
정규화를 통해 자료의 중복성을 제거하며, 이를 통해 더 빠른 검색이 가능하다.
삽입, 삭제, 갱신시의 이상현상 또한 제거한다.
이상 현상의 종류
삽입 이상
기본키는 NULL이 될 수 없으므로 기본키를 입력하지 않을 경우 엔티티 무결성 제약에 의해 삽입 이상이 발생한다.
삭제 이상
테이블 내에서 하나뿐인 튜플의 일부 필드를 삭제할 때, 삭제하지 말아야 할 다른 필드까지 함께 삭제되는 경우이다.
수정 이상
특정 컬럼의 모든 5 값을 6으로 바꾸려 하는데, 일부만 6으로 변경되어 5, 6이 혼재되는 경우이다.
정규화의 종류
정규화는 1, 2, 3, BCNF (3.5), 4, 5 정규화로 분류한다.
정규화가 진행될수록 테이블 수가 늘어나고 검색 속도가 낮아지기 때문에, 일반적으로 BNCF 정규화까지만 진행한다.
제1 정규화
반복되는 값이나 여러 값을 갖는 다치 어트리뷰트를 제거하여, 어트리뷰트가 반드시 하나의 값을 갖도록 하는 과정이다.
제 1 정규형을 만족하는 테이블은 모든 모든 필드가 원자값(단 하나의 값)을 가진다.
제2 정규화
테이블의 모든 어트리뷰트가 기본키에 대해 "완전 함수적 종속"상태로 만드는 과정이다. (이 때, 테이블은 제1 정규화 만족 상태여야 한다.)
사번 | 이름 | 주소 | 부서번호 | 부서명 |
1 | 김사원 | 서울 | 4 | 개발 |
2 | 이사원 | 부산 | 5 | 경영지원 |
3 | 최사원 | 제주 | 5 | 경영지원 |
사번 -> 이름, 주소 특정이 가능하다. 따라서 이름과 주소는 사번에 대해 종속이다.
부서번호 -> 부서명 특정이 가능하다. 따라서 부서명은 부서번호에 대해 종속이다.
그로므로 위 테이블은 부분 함수적 종속이 2개 존재하는 상태이다.
따라서 '결정자'인 사번에 종속되는 값만을 남기도록 테이블을 분리해주어야 한다.
위 테이블을 아래와 같이 두 개의 테이블로 분류하면, 각 테이블은 키를 제외한 다른 모든 어트리뷰트가 키에 종속되는 완전 함수적 종속이 된다.
- 사원 테이블
사번 | 이름 | 주소 |
1 | 김사원 | 서울 |
2 | 이사원 | 부산 |
3 | 최사원 | 제주 |
- 부서 테이블
사번 | 부서번호 | 부서명 |
1 | 4 | 개발 |
2 | 5 | 경영지원 |
3 | 5 | 경영지원 |
제3 정규화
기본키 이외의 어트리뷰트에 종속적인 어트리뷰트를 제거하는 과정이다. (이 때, 테이블은 제2 정규화 만족 상태여야 한다.)
A -> B이고 B -> C 일 때, A -> C가 되는 것을 분류해주어야 한다. 위에서 생성한 부서 테이블을 살펴보면,
- 사번으로 특정 부서에 소속된 것을 파악할 수 있고 (A -> B),
- 부서 번호를 통해 부서명을 파악할 수 있다. (B -> C)
- 사번으로 부서명을 알 수 있다. (A -> C)
이를 이행적 종속성 상태라고 한다.
따라서 부서 테이블을 두 개의 테이블로 분류하면 이행적 종속성을 제거할 수 있고, 제3 정규형을 만족한다.
사번 | 부서번호 |
1 | 4 |
2 | 5 |
3 | 5 |
부서번호 | 부서명 |
4 | 개발 |
5 | 경영지원 |
5 | 경영지원 |
BCNF (Boyce-codd normal form, 보이스 코드 정규화)
릴레이션의 모든 결정자를 후보키로 만드는 과정이다.
즉, 테이블 내에서 후보키가 아닌 어떤 어트리뷰트가 다른 어트리뷰트를 결정하지 않아야 한다.
일반적으로 제3 정규화 이후에도 후보키가 여러개 존재하고, 서로 중첩되어 나타나는 경우에 적용 가능하다.
사번 | 부서명 | 부서장 |
1 | 개발 | 김길동 |
2 | 경영지원 | 이길동 |
3 | 경영지원 | 이길동 |
위 테이블에서
- 사번, 부서명을 통해 부서장을 알 수 있다.
- 사번, 부서장을 통해 부서명을 알 수 있다.
그리고 위 테이블의 후보키는 [사번, 부서명]과 [사번, 부서장] 이다.
이 때, 결정자 중 후보키가 아닌 속성이 존재한다. 즉 함수적 종속 부서장 -> 부서명이 존재하는데, 위 테이블에서 부서장은 후보키가 아니므로, BCNF를 만족하지 않는다.
따라서 아래와 같이 두 개의 테이블로 분류하여 3.5정규화를 만족시킬 수 있다.
사번 | 부서장 |
1 | 김길동 |
2 | 이길동 |
3 | 이길동 |
부서장 | 부서명 |
김길동 | 개발 |
이길동 | 경영지원 |
이길동 | 경영지원 |
댓글