데이터 베이스 정규화는 불필요한 데이터를 없애고, CRUD 시 발생할 수 있는 이상현상을 방지하게 데이터베이스 설계를 재구성하는 것이다.
1차 정규화는 각 row마다 column의 값이 1개씩만 있어야 한다. 즉, column이 원자값을 가져야 한다.
이름 |
나이 |
과목 |
철수 |
16 |
수학,영어 |
영희 |
17 |
수학 |
남수 |
15 |
국어 |
기철 |
18 |
영어 |
위의 테이블을 보면 철수의 과목에 2개의 값이 들어 있다.
그래서 1차 정규화에 만족하지 못한다.
이름 |
나이 |
과목 |
철수 |
16 |
수학 |
철수 |
16 |
영어 |
영희 |
17 |
수학 |
남수 |
15 |
국어 |
기철 |
18 |
영어 |
위와 같이 바꾸면 1차 정규화를 만족한다.
2차 정규화는 모든 column이 완전 함수적 종속을 만족하는 것이다. 즉, 부분적 종속을 제거 하는 것이다.
이름 |
프로젝트명 |
부서 |
직위 |
수당 |
철수 |
보안관리 |
개발 |
팀장 |
100 |
철수 |
IOT만들기 |
개발 |
부팀장 |
70 |
영희 |
웹기사분류 |
분석 |
팀장 |
100 |
남수 | 형태소분석 | 연구 | 사원 | 50 |
위의 테이블을 보면 이름, 프로젝트명이 기본키인데 부서 컬럼은 이름에 의해서만 함수적 종속성을 가진다.
이름 |
프로젝트명 |
직위 |
수당 |
철수 |
보안관리 |
팀장 |
100 |
철수 |
IOT만들기 |
부팀장 |
70 |
영희 |
웹기사분류 |
팀장 |
100 |
남수 |
형태소분석 |
사원 |
50 |
위와 같이 두 개의 테이블로 나누면 부분적 종속을 제거하고 2차 정규화를 만족한다.
3차 정규화는 이행적 함수적 종속성을 제거하는 것이다.
이름 |
프로젝트명 |
직위 |
수당 |
철수 |
보안관리 |
팀장 |
100 |
철수 |
IOT만들기 |
부팀장 |
70 |
영희 |
웹기사분류 |
팀장 |
100 |
남수 |
형태소분석 |
사원 |
50 |
위 테이블을 보면 수당은 기본키가 아닌 직위에 의존적이다.
이름 |
프로젝트명 |
직위 |
철수 |
보안관리 |
팀장 |
철수 |
IOT만들기 |
부팀장 |
영희 |
웹기사분류 |
팀장 |
남수 |
형태소분석 |
사원 |
직위 |
수당 |
팀장 |
100 |
부팀장 |
70 |
사원 |
50 |
위와 같이 두 개의 테이블로 나누면 3차 정규화를 만족한다.
비결정자에 의한 함수종속을 제거해야 하는 것이다.
테이블 내에서 N:M 관계를 가지는 속성들을 분리 하는 것이다.