1. 정의
Normalization
관계형 데이터 모델에서 데이터의 중복성을 제거하여 이상 현상(Anomaly)을 방지하고, 데이터의 일관성과 정확성을 유지하기 위해 무손실 분해하는 과정을 말한다.
이상(Anomaly)
정규화를 거치지 않은 데이터베이스 내 데이터들이 불필요하게 중복되어 릴레이션 조작 시 발생하는 예기치 않은 현상을 말한다.
삽입 이상, 삭제 이상, 갱신 이상이 있다.
2. 목적
- 중복 데이터를 최소화하여 테이블 불일치 위험을 최소화
- 수정, 삭제 시 이상 현상을 방지함으로써 데이터 구조의 일관성을 최대화
- 데이터 삽입 시 릴레이션 재구성에 대한 필요성을 줄임
- 효과적인 검색 알고리즘 생성
3. 정규화 단계
비정규 릴레이션 -(원자값이 아닌 도메인 분해)-> 1NF -(부분적 함수 종속 제거)-> 2NF -(이행적 함수 종속 제거)-> 3NF -(결정자이면서 후보키가 아닌 것 제거)-> BCNF -(다치 종속 제거)-> 4NF -(조인 종속성 이용)-> 5NF
실무적으로 제4, 5 정규형은 잘 쓰이지는 않는다고 한다.
1) 제 1정규화 (1NF)
"테이블 내의 속성값은 원자값을 가지고 있어야 한다."
즉, 릴레이션에 속하는 속성의 속성 값이 모두 원자값(Atomic Value)만으로 구성되어야 한다.
*원자값이란, 더 이상 쪼개질 수 없는 단위를 말한다.
1NF는 다음을 만족해야 한다.
1. 각 컬럼이 하나의 속성만을 가져야 한다.
2. 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
3. 각 컬럼이 유일한(unique) 이름을 가져야 한다.
4. 칼럼의 순서가 상관없어야 한다.
아래처럼 릴레이션이 이루어져 있다면, 제 1정규형을 만족하지 못한다.
학번이 100인 학생의 과목 번호와 성적이 2개로 이루어져 있기 때문이다.
위의 릴레이션에서는 삽입, 삭제, 갱신 이상이 존재한다.
이러한 이상 현상이 발생하는 이유는, 기본키가 아닌 속성들이 기본키에 완전 함수 종속되지 못하고 부분 함수 종속되어있기 때문이다.
2) 제 2정규화 (2NF)
"부분 함수 종속을 제거한다. (완전 함수 종속 관계)"
2NF는 다음을 만족해야 한다.
1. 제 1정규형을 만족해야 한다.
2. 모든 컬럼이 부분적 종속이 없어야 한다. 즉, 모든 컬럼이 완전 함수 종속을 만족해야 한다.
부분 함수 종속 (Partial Functional Dependency)
: 기본키 중 특정 컬럼에만 종속
완전 함수 종속 (Full Functional Dependency)
: 기본키의 부분 집합이 결정자가 되어서는 안된다.
예시
(학생 번호, 과목) 복합키가 기본키라고 하자,
이때 특정 과목의 지도교수는 과목명만 알면 알 수 있다. 즉, 지도교수 컬럼이 (학생번호, 과목)에 종속되지 않고 (과목)에만 종속적이다.
제 2 정규화를 통해 다음과 같이 분리해야 한다.
3) 제 3정규화 (3NF)
"이행 함수 종속을 제거한다."
3NF는 다음을 만족해야 한다.
1. 제 2정규형을 만족해야 한다.
2. 기본키를 제외한 속성들간의 이행 종속성(Transitive Dependency)이 없어야 한다.
이행 함수 종속 (Transitive Functional Dependency)
A → B, B → C 일 때 A → C를 만족하면 이행 함수 종속이라고 한다.
ID → 등급, 등급 → 할인율, ID → 할인율 을 만족한다. 즉 이행 함수 종속이 존재한다.
제 3 정규화를 통해 다음과 같이 분리해야 한다.
4. 보이스-코드 정규화 (BCNF)
"결정자가 후보키가 아닌 함수 종속을 제거한다."
BCNF는 다음을 만족해야 한다.
1. 제 3정규형을 만족해야한다.
2. 모든 결정자가 후보키 집합에 속해야 한다.
위의 테이블은 (학생번호, 과목)이 기본키로 지도교수를 알 수 있다. 그러나 지도교수를 알면 과목을 알 수 있으므로, 지도교수 → 과목 이 종속적이다.
즉, 후보키 집합에 속하지 않은 결정자가 존재하므로 BCNF를 만족하지 않는다.
BCNF를 만족하기 위해서는 다음과 같이 분리하면 된다.
5) 제 4정규화 (4NF)
"다치 종속을 제거한다."
4NF는 다음을 만족해야 한다.
1. BCNF를 만족해야 한다.
2. 다중값 종속(다치 종속)이 없어야 한다.
다치 종속(Multi-valued Dependency)
같은 테이블 내의 독립적인 두 개 이상의 컬럼이 또 다른 컬럼에 종속되는 것을 말한다.
즉, A → B 인 의존성에서 단일 값 A와 다중 값 B가 존재한다면 다치 종속이라고 할 수 있다. 이러한 종속을 A ↠ B 로 표기한다. (다치 종속은 이중 화살표(double arrow) ↠ 로 표기한다.)
다치 종속은 최소 2개의 컬럼이 다른 컬럼에 종속되어야 하기 때문에 최소 3개의 컬럼이 필요하다.
아래 테이블은 두가지 의존성을 가지므로, 다치 종속이 존재한다.
위와 같이 분리할 수 있다.
6) 제 5정규화 (5NF)
"조인 종속을 제거한다."
1. 4NF를 만족해야 한다.
2. 더 이상 비손실 분해를 할 수 없어야 한다.
조인 종속 (Joint dependency)
하나의 릴레이션을 여러개의 릴레이션으로 분해하였다가, 다시 조인했을 때 데이터 손실이 없고 필요없는 데이터가 생기는 것을 말한다. 조인 종속성은 다치 종속의 개념을 더 일반화한 것이다.
위의 4NF 테이블에 대해 조인 연산을 수행하면 다음과 같은 결과가 나온다.
위의 결과를 보면 제 4정규화를 수행하기 전 데이터와 다른 것을 알 수 있다.
데이터 손실은 없지만 필요없는 데이터가 추가적으로 생겼으므로 5NF를 만족하지 않는다.
제 5정규화를 통해 다음과 같이 분리할 수 있다.
출처 및 참고
- https://velog.io/@wisdom-one/%EC%A0%95%EA%B7%9C%ED%99%94Normalization
'공부' 카테고리의 다른 글
[DB] 트랜잭션 ACID란? (Atomicity, Consistency, Durability, Isolation) (0) | 2025.02.10 |
---|---|
Large Language Models are Zero-Shot Reasoners 논문 리뷰 (3) | 2025.02.02 |
[Open CV] 색상 곰 탐지 알고리즘 다양한 방법으로 풀기 cv2.HoughCircles, bfs (0) | 2025.01.26 |
Docker 개념 및 핵심 설명, 왜 핫한가? (2) | 2025.01.19 |
docker: error during connect: dockerDesktopLinuxEngine: The system cannot find the file specified. (0) | 2025.01.14 |