[Model] 데이터베이스 정규화(Normalization)
1. 정규화(Normalization)란?
- 데이터베이스 설계 시 데이터 중복을 최소화하기 위해 데이터를 구조화하는 과정
- 데이터 일관성, 최소 중복, 유연성을 위해 데이터를 분해하는 과정
- 함수적 종속성 개념에 기반하여 부정확한 종속성을 없애는 과정
- 데이터의 일관성과 무결성을 유지하기 위한 방법
2. 정규화가 필요한 이유
- 데이터 중복은 불필요한 공간 차지에 따른 비용이 발생
- 데이터 중복은 이상(Anomaly)을 발생시킴
→ 이상의 종류에는 삽입이상, 삭제이상, 갱신이상이 존재
→ 정규화의 기본 목적은 중복된 데이터를 허용하지 않음에 있어, 위와 같은 문제 해결에 도움
- 정규화된 데이터 모델일수록 유연성이 증가하고, 이는 DB 구조변경 대응에 수월
→ 엔트로피 증가 법칙에 따라 시스템은 시간에 비례해 복잡도가 증가함. 즉, 재구축 등 Cost를 줄이려면 유연성 확보 必
3. 정규화 종류
- 제 1정규화 : 릴레이션 내 값에 대해 원자성을 보장하는 것
순번 | 이름 | 성별 | 전화번호 |
1 | 홍길동 | 남 | 010-1234-5678, 010-6666-7777 |
2 | 기은센 | 여 | 010-9876-5432 |
3 | 정민혁 | 남 | 010-0000-1111, 010-2222-3333, 010-4444,5555 |
위 릴레이션은 전화번호 속성에 1개의 전화번호가 아닌, n개의 전화번호가 포함되어 있어 제 1정규형을 만족하지 못한다.
이를 제 1정규화 과정(전화번호 속성값 분리)을 통해 아래와 같이 제 1정규형을 만족시킬 수 있다.
순번 | 이름 | 성별 | 전화번호 |
1 | 홍길동 | 남 | 010-1234-5678 |
2 | 홍길동 | 남 | 010-6666-7777 |
3 | 기은센 | 여 | 010-9876-5432 |
4 | 정민혁 | 남 | 010-0000-1111 |
5 | 정민혁 | 남 | 010-2222-3333 |
6 | 정민혁 | 남 | 010-4444-5555 |
- 제 2정규화 : 1정규형을 만족하면서, 부분 함수 종속을 제거하는 것
사원별제품판매실적 | ||||
사원번호 | 판매순번 | 판매제품코드 | 판매수량 | 사원명 |
42346 | 1 | 2020 | 10 | 정민혁 |
42346 | 2 | 3030 | 20 | 정민혁 |
12345 | 1 | 8080 | 20 | 홍길동 |
12345 | 2 | 5555 | 50 | 홍길동 |
12345 | 3 | 1212 | 100 | 홍길동 |
위는 사원별판매실적 릴레이션이고, 사원번호, 판매관리번호, 판매제품코드 라는 기본키(Primary Key)를 가진다.
제 2정규형의 경우 기본키에 속하지 않은 모든 속성은 기본키에 완전 함수 종속인 정규형을 의미한다.
하지만 위 릴레이션 내 사원명 속성의 경우 사원번호에만 종속적이기에 제 2정규형을 만족하지 못한다.
이를 제 2정규화 과정(릴레이션 분리)을 통해 아래와 같이 제 2정규형을 만족시킬 수 있다.
사원별제품판매실적 | |||
사원번호 | 판매순번 | 판매제품코드 | 판매수량 |
42346 | 1 | 2020 | 10 |
42346 | 2 | 3030 | 20 |
12345 | 1 | 8080 | 20 |
12345 | 2 | 5555 | 50 |
12345 | 3 | 1212 | 100 |
사원정보 | |
사원번호 | 사원명 |
42346 | 정민혁 |
42346 | 정민혁 |
12345 | 홍길동 |
12345 | 홍길동 |
12345 | 홍길동 |
- 제 3정규화 : 2정규형을 만족하면서, 이행 함수 종속을 제거하는 것
교과목평점 | |||
학번 | 교과목코드 | 학점코드 | 학점평점 |
20201234 | 1001 | A | 4 |
20201234 | 1002 | B | 3 |
20210534 | 1005 | A | 4 |
20210534 | 1006 | C | 2 |
위는 교과목평점 릴레이션이고, 학번, 교과목코드 라는 기본키(Primary Key)를 가진다.
제 3정규형의 경우 제 2정규형에 속하면서, 기본키가 아닌 모든 속성이 이행적 함수 종속이 없어야 한다.
하지만 위 릴레이션의 경우 학점코드라는 일반 속성은 학번, 교과목코드에 종속되고,
학점평점이라는 일반 속성은 학점코드에 종속되기 때문에 이행적 함수 종속이 발생한 케이스이다.
이를 제 3정규화 과정(릴레이션 분리)을 통해 아래와 같이 제 3정규형을 만족시킬 수 있다.
학번 | 교과목코드 | 학점코드 |
20201234 | 1001 | A |
20201234 | 1002 | B |
20210534 | 1005 | A |
20210534 | 1006 | C |
학점코드 | 학점평점 |
A | 4 |
B | 3 |
A | 4 |
C | 2 |
- BCNF, 제 4정규화, 제 5정규화도 존재하나, 더 복잡하고 추상적인 개념이기에 별도 설명 X
* 경험상 실무에선 기본적인 1NF, 2NF, 3NF도 이루어지지 않는 경우 多(기본이라도 지키자 mind)
4. 정규화의 문제점
- 여러 테이블간 조인(JOIN)이 유발되어 데이터 조회(SELECT) 시 성능 저하
→ 이러한 문제점을 해결할 수 있는 방법의 한 가지가 반정규화(역정규화)
5. 반정규화(De-Normalization)란?
- 조회(SELECT) 성능 향상을 위해 데이터의 중복을 허용하는 방법
→ 반정규화 시 데이터의 일관성 및 모델의 유연성을 저해할 수 있음
6. 반정규화가 필요한 경우
- OLAP 시스템과 같이 복잡하고 대규모 데이터 처리를 위해 성능 개선이 필요한 경우
- 지나치게 조인(JOIN)이 발생하거나, 항상 특정 범위만을 조회(SELECT)하는 경우 등
7. 반정규화 종류
- 테이블 반정규화 : 테이블 병합, 테이블 분할, 테이블 추가
- 컬럼 반정규화 : 중복컬럼 추가, 파생컬럼 추가 등
- 관계 반정규화 : 중복관계 추가
※ 핵심요약 ※
1. 정규화는 모델 유연성, 데이터 무결성을 유지하기 위해 함수적 종속성 개념에 기반하여 데이터 중복을 최소화 하는 과정
2. 기본적으로 정규화된 데이터 모델을 지향해야함. 하지만 정규화된 모델은 물리적인 성능문제를 발생시킬 수 있음
3. 조회 성능 문제를 해결하기 위한 기법 중 반정규화가 있으나, 중복을 발생시키는 개념이므로 충분한 검토가 필요
4. 반정규화를 검토하기 전 무조건적인 선행조건은 정규화임. 즉, 정규화 없이 반정규화는 없음.