정규화(Normalization)란
데이터베이스 정규화는 관계형 데이터 모델에서 데이터의 중복성을 제거하여 이상 현상을 방지하고, 데이터의 일관성과 정확성을 유지하기 위해 무손실 분해하는 과정이다.
- 이상현상(Anomaly): 릴레이션 조작 시 데이터들이 불필요하게 중복되어 예기치 않게 발생하는 현상. 삽입이상(Insertion Anomaly), 갱신이상(Update Anomaly), 삭제이상(Deletion Anomaly)이 있다.
정규화 단계

- 처음부터 순차적으로 진행하며 NF를 만족하지 못하면 만족하도록 테이블 구조를 조정한다.
- 앞 단계를 만족해야만 다음 단계로 진행할 수 있다.
ex) 3NF를 만족하고 있는 테이블은 1NF, 2NF, 3NF를 전부 만족하고있다.
1차 정규화(1NF)
테이블 내의 속성 값은 원자값을 가지고 있어야 한다.
즉 한칸에 하나의 데이터만 가져오도록 테이블을 분해하는 작업이다.
고객ID | 이메일 |
---|
1 | Kosmo1@domain.com, Kosmo2@domain.com |
- 이메일 주소가 속성에 2개 이상 가지고 있는 경우 원자값이 아니다.
고객ID | 이메일 |
---|
1 | Kosmo1@domain.com |
1 | Kosmo2@domain.com |
- 때문에 속성 1개만 가지도록 저장하면 1차 정규화를 만족한다.
2차 정규화(2NF)
기본키를 제외한 모든 컬럼은 부분적 종속(Partial Dependency)이 없어야한다
= 기본키를 제외한 모든 컬럼이 모든키에 대하여 완전 함수 종속(Fully Functionally Dependency)을 만족해야 한다.
즉 현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업이다.
고객명 | 서비스이름 | 서비스가격 | 서비스이용기간 |
---|
홍길동 | 헬스 | 70,000 | 1달 |
홍길동 | 수영 | 100,000 | 2달 |
장길산 | 수영 | 100,000 | 2달 |
고객명, 서비스이름
이 서비스이용기간
에 영향을 주고,
서비스이름
이 서비스가격
에 영향을 주는 관계를 부분 함수 종속 관계
라고한다.
고객명, 서비스이름, 서비스가격, 서비스이용기간
을 한 테이블에 두는 것은 부분 함수 종속성
으로 인해 2차 정규화를 만족하지 못한다.
고객명 | 서비스이름 | 서비스이용기간 |
---|
홍길동 | 헬스 | 1달 |
홍길동 | 수영 | 2달 |
장길산 | 수영 | 2달 |
서비스이름 | 서비스가격 |
---|
헬스 | 70,000 |
수영 | 100,000 |
수영 | 100,000 |
- 부분관계인
서비스이름, 서비스가격
관계를 별도의 테이블로 두면 부분 함수 종속 관계가 제거되어 2차 정규화를 만족한다.
3차 정규화(3NF)
기본키를 제외한 모든 컬럼은 속성들 간의 이행 종속성(Transitive Dependency)이 없어야 한다.
즉 일반컬럼에만 종속된 컬럼을 다른테이블로 빼는 작업이다.
책번호 | 도서이름 | 도서가격 | 출판사 | 홈페이지 |
---|
1 | C언어 | 30,000 | A사 | www.a.com |
2 | C++언어 | 25,000 | B사 | www.b.com |
3 | JAVA언어 | 40,000 | B사 | www.b.com |
책번호
가 출판사
에 영향을 주고, 출판사
가 홈페이지
에 영향을 주는 관계인
A->B이고 B->C이면서 A->C관계가 같이 있는 경우를 이행함수 종속관계라고 한다.
책번호, 출판사, 홈페이지
를 한 테이블에 두는 것은 이행함수 종속성으로 인해 3차 정규화를 만족하지 못한다.
책번호 | 도서이름 | 도서가격 | 출판사 |
---|
1 | C언어 | 30,000 | A사 |
2 | C++언어 | 25,000 | B사 |
3 | JAVA언어 | 40,000 | B사 |
출판사 | 홈페이지 |
---|
A사 | www.a.com |
B사 | www.b.com |
책번호
는 홈페이지
에 직접 영향을 주는 관계가 아니기 때문에(A->C관계),
책번호, 출판사
테이블과 출판사, 홈페이지
테이블로 분리하여 이행함수 관계를 제거해 3차정규화를 만족시킨다
보이스-코드 정규화(BCNF)
모든 결정자가 후보키 집합에 속해야 한다.
학번 | 과목명 | 교수명 |
---|
202001 | C언어 | 장길산 |
202001 | 데이터베이스 | 홍길동 |
202002 | 데이터베이스 | 홍길동 |
학번, 과목명
이 교수명
에 영향을 주고, 교수명
이 과목명
에 영향을 주는 관계로서,
교수명
은 과목명
에 영향을 주지만, 한 테이블에 같이 존재하고 교수명
은 키가 아닌 상황이므로 결정자인 교수명
이 후보키가 아니다.
학번, 과목명, 교수명
을 한 테이블에 두는 것은 교수명
이 결정자이지만 후보 키가 아니기 때문에 보이스-코드 정규화를 만족하지 못한다.
학번 | 교수명 |
---|
202001 | 장길산 |
202001 | 홍길동 |
202002 | 홍길동 |
교수명 | 과목명 |
---|
장길산 | C언어 |
홍길동 | 데이터베이스 |
홍길동 | 데이터베이스 |
교수명
은 과목명
에 직접 영향을 주기 때문에 교수명, 과목명
테이블로 분리하여 교수명이 후보키 역할을 하도록 하여 보이스`코드 정규화를 만족한다.
4차 정규화(4NF)
다차(다중 값) 종속성 제거, 특정 속성 값에 따라 선택적인 속성을 분리한다.
개발자 | 자격증 | 언어 |
---|
홍길동 | 정보처리기사 | C |
홍길동 | 빅데이터분석기사 | C++ |
장길산 | 정보보안기사 | JAVA |
개발자
마다 자격증
값들이 여러 개 존재하고, 특정 개발자
마다 언어
값들이 여러 개 존재하는 경우 다치 종속관계라고 한다.
개발자
별로 여러자격증
값을 가지고 있고, 개발자
별로 여러 언어
값을 가지고있다.
개발자 | 자격증 |
---|
홍길동 | 정보처리기사 |
홍길동 | 빅데이터분석기사 |
장길산 | 정보보안기사 |
개발자, 자격증
, 개발자, 언어
테이블로 분리하여 관리하면 다치 종속관계를 제거하기 때문에 4차 정규화를 만족한다.
5차 정규화(5NF)
조인 종속성을 제거한다.
개발자 | 자격증 | 언어 |
---|
홍길동 | 정보처리기사 | C |
홍길동 | 빅데이터분석기사 | C++ |
장길산 | 정보보안기사 | JAVA |
- 4차 정규화 테이블에 대해 조인 연산을 수행하면 4차 정규화 수행 전 데이터와 다르게 되는 문제인 조인 종속성이 발생한다.
개발자 | 자격증 |
---|
홍길동 | 정보처리기사 |
홍길동 | 빅데이터분석기사 |
장길산 | 정보보안기사 |
자격증 | 언어 |
---|
정보처리기사 | C |
빅데이터분석기사 | C++ |
정보보안기사 | JAVA |
- 조인 종속관계를 제거하기 위해서는 모든 속성관계인
개발자, 자격증
, 개발자, 언어
뿐 아니라 자격증, 언어
관계에 대한 테이블을 만들어 줌으로써 조인했을 때 정확히 원래의 데이터로 복원할 수 있게한다.