정규화 (Normalization)
정규화란?
- 데이터 중복과 이상현상(삽입, 갱신, 삭제)를 최소화하기 위해 데이터를 정규형(normal form - NF)에 맞도록 구조화하는 프로세스
- 정규화 단계: 제1정규형 → 제2정규형 → 제3정규형 → BCNF → 제4정규형 → 제5정규형
- 보통 실무에서는 3정규형, BCNF형까지 많이 쓴다고 알려짐
제 1 정규형 (1NF)
- 테이블에 속한 모든 속성의 도메인(domain)이 원자값(atomic value)만으로 구성되어있으면 제1정규형
- 도메인: 속성 하나가 가질 수 있는 모든 값의 집합
제 1 정규형을 만족하지 못하는 테이블
| 학생ID | 학생이름 | 수강과목 |
|---|
| 1 | 홍길동 | 수학, 과학 |
| 2 | 이몽룡 | 영어, 사회, 과학 |
수강과목 컬럼이 복합값(수학, 과학)으로 구성되어 있어 원자값의 조건을 충족하지 못함
제 1 정규형을 만족하는 테이블로 변경
| 학생ID | 학생이름 | 수강과목 |
|---|
| 1 | 홍길동 | 수학 |
| 1 | 홍길동 | 과학 |
| 2 | 이몽룡 | 영어 |
| 2 | 이몽룡 | 사회 |
| 2 | 이몽룡 | 과학 |
- 모든 컬럼 값이 원자값으로 구성되어 있어 제 1 정규형을 만족
제 2 정규형 (2NF)
- 테이블이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수적 종속되면 제2정규형
- 부분 함수적 종속를 제거해야함
- 즉, 기본키의 일부에만 종속된 속성을 제거해야함
제 2 정규형을 만족하지 못하는 테이블
| 고객ID(PK) | 이벤트ID(PK) | 당첨여부 | 등급 | 할인율 |
|---|
| apple | E001 | Y | gold | 10% |
| apple | E005 | N | gold | 10% |
| apple | E010 | Y | gold | 10% |
| banana | E002 | N | vip | 20% |
| banana | E005 | Y | vip | 20% |
| carrot | E003 | Y | gold | 10% |
| carrot | E007 | Y | gold | 10% |
| orange | E004 | N | silver | 5% |
- 기본키: (고객ID, 이벤트ID)
- 문제점:
등급, 할인율은 고객ID에만 종속 (부분 함수적 종속)
고객ID → 등급, 고객ID → 할인율
제 2 정규형을 만족하는 테이블로 변경
1. 고객 릴레이션
| 고객ID(PK) | 등급 | 할인율 |
|---|
| apple | gold | 10% |
| banana | vip | 20% |
| carrot | gold | 10% |
| orange | silver | 5% |
2. 이벤트참여 릴레이션
| 고객ID(PK) | 이벤트ID(PK) | 당첨여부 |
|---|
| apple | E001 | Y |
| apple | E005 | N |
| apple | E010 | Y |
| banana | E002 | N |
| banana | E005 | Y |
| carrot | E003 | Y |
| carrot | E007 | Y |
| orange | E004 | N |
제 3 정규형 (3NF)
- 테이블이 제2정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수적 종속이 되지 않으면 제3정규형
제 3 정규형을 만족하지 못하는 테이블
| 고객ID(PK) | 등급 | 할인율 |
|---|
| apple | gold | 10% |
| banana | vip | 20% |
| carrot | gold | 10% |
| orange | silver | 5% |
- 문제점:
등급은 고객ID에 종속 (고객ID → 등급)
할인율은 등급에 종속 (등급 → 할인율)
- 따라서,
고객ID → 등급 → 할인율의 이행적 함수적 종속(고객ID → 할인율)이 발생
제 3 정규형을 만족하는 테이블로 변경
1. 고객 릴레이션
| 고객ID(PK) | 등급(FK) |
|---|
| apple | gold |
| banana | vip |
| carrot | gold |
| orange | silver |
2. 등급 릴레이션
| 등급(PK) | 할인율 |
|---|
| gold | 10% |
| vip | 20% |
| silver | 5% |
- 테이블이 제3정규형에 속하고, 모든 결정자가 후보키가 되도록 하는 정규형
- 후보키: 테이블에서 각 행(row)을 고유하게 식별할 수 있는 속성 또는 속성들의 집합
- 결정자: (A -> B) 함수적 종속 관계에서 A가 결정자
BCNF를 만족하지 못하는 테이블
| 학생ID(PK) | 과목ID(PK) | 강의실 | 교수ID |
|---|
| S001 | C001 | R101 | P001 |
| S002 | C001 | R101 | P001 |
| S001 | C002 | R102 | P002 |
| S003 | C002 | R102 | P002 |
- 결정자:
강의실 → 교수ID (강의실에서 담당 교수는 고유)
- 그러나
강의실은 후보키가 아니므로 BCNF를 만족하지 않음
BCNF를 만족하는 테이블로 변경
1. 강의실-교수 릴레이션
| 강의실(PK) | 교수ID |
|---|
| R101 | P001 |
| R102 | P002 |
2. 학생-과목 릴레이션
| 학생ID(PK) | 과목ID(PK) | 강의실(FK) |
|---|
| S001 | C001 | R101 |
| S002 | C001 | R101 |
| S001 | C002 | R102 |
| S003 | C002 | R102 |
제4정규형(4NF)과 제5정규형(5NF)
- 보통 4NF나 5NF는 실무에서 거의 사용하지 않으며, 이론적 측면이 강함
제4정규형
- 테이블이 BCNF정규형에 속하고, 다중값 종속(Multi-Valued Dependency)을 제거한 정규형
- 다중값 종속은 여러 다중값 속성이 서로 독립적으로 존재할 때 발생
- 하나의 다중값 속성만 존재하면, 독립적 가능성이 없으므로 4NF 위반아님
제 4 정규형을 만족하지 못하는 테이블
예시:
- 한 학생이 여러 전화번호와 여러 주소를 가질 때, 전화번호와 주소는 독립적으로 여러 값을 가짐
- 학생ID → 전화번호 (1:N)
- 학생ID → 주소 (1:N)
| 학생ID | 전화번호 | 주소 |
|---|
| 1 | 010-1234 | 서울시 강남구 |
| 1 | 010-5678 | 서울시 강남구 |
| 1 | 010-1234 | 부산시 해운대 |
제 4 정규형을 만족하는 테이블로 변경
1. 학생-전화번호 릴레이션
| 학생ID | 전화번호 |
|---|
| 1 | 010-1234 |
| 1 | 010-5678 |
2. 학생-주소 릴레이션
제5정규형
- 테이블이 제4정규형을 만족하고, 조인 종속(Join Dependency)을 제거한 정규형
- 조인 종속은 테이블을 여러 개로 분해한 후 다시 조인했을 때, 원래의 테이블을 복원할 수 없는 경우에 발생
제 5 정규형을 만족하지 못하는 테이블
1. 학생-전화번호 릴레이션
| 학생ID | 전화번호 |
|---|
| 1 | 010-1234 |
| 1 | 010-5678 |
2. 학생-주소 릴레이션
문제: 조합 관계
위 두 테이블을 조인하면 다음과 같이 모든 조합이 생성됨:
| 학생ID | 전화번호 | 주소 |
|---|
| 1 | 010-1234 | 서울시 강남구 |
| 1 | 010-1234 | 부산시 해운대 |
| 1 | 010-5678 | 서울시 강남구 |
| 1 | 010-5678 | 부산시 해운대 |
제 5 정규형을 만족하는 테이블로 변경
1. 학생-전화번호 릴레이션
| 학생ID | 전화번호 |
|---|
| 1 | 010-1234 |
| 1 | 010-5678 |
2. 학생-주소 릴레이션
3. 전화번호-주소 릴레이션
| 전화번호 | 주소 |
|---|
| 010-1234 | 서울시 강남구 |
| 010-1234 | 부산시 해운대 |
| 010-5678 | 부산시 해운대 |
비정규화 (Denormalization, 역정규화)
- 정규화로 인해 여러 개로 분해된 테이블에서 원하는 정보를 얻으려면 조인을 사용하여 연결해야함
- 자주 조인을 사용하면, 응답 속도가 떨어지므로 정규화에 위배되지만 성능 향상을 위해 다시 테이블을 합침
- 이것을 비정규화 또는 역정규화라고 함
정규화는 데이터 중복과 이상 현상을 제거하여 데이터 무결성을 보장하고, 비정규화는 성능 최적화를 위해 이를 의도적으로 완화하는 작업으로, 상황에 따라 적절히 사용해야함
Reference
https://terms.naver.com/entry.naver?docId=3431248&cid=58430&categoryId=58430&expCategoryId=58430