데이터베이스 정규화 완벽 가이드
정규화란 무엇인가
정규화(Normalization)는 데이터베이스 설계 시 데이터의 중복을 최소화하고 데이터의 무결성을 보장하기 위해 테이블을 구조화하는 과정이다.
왜 정규화가 필요한가
정규화를 하지 않으면 발생하는 문제들:
- 데이터 중복 - 같은 정보가 여러 곳에 저장되어 공간 낭비
- 데이터 불일치 - 한 곳에서 수정했는데 다른 곳은 수정 안 됨
- 삽입 이상 - 새로운 데이터를 추가할 때 불필요한 정보도 함께 입력해야 함
- 삭제 이상 - 데이터를 삭제할 때 의도치 않은 정보까지 삭제됨
- 수정 이상 - 같은 데이터를 여러 곳에서 수정해야 함
정규화 단계별 설명
정규화는 크게 1NF, 2NF, 3NF로 나뉜다. 각 단계를 차근차근 정리한다.
함수 종속 (정규화의 핵심 개념)
정규화는 함수 종속을 분석하는 과정이다.
함수 종속(FD)
- A가 결정되면 B는 반드시 하나로 결정됨
- A = 결정자, B = 종속자
예시
- 학번이 같으면 이름은 항상 같음
제1 정규형 (1NF - First Normal Form)
정의
하나의 컬럼에는 하나의 값만 저장되어야 합니다.
예시
정규화 전 (1NF 위반)
| 학생ID | 이름 | 수강과목 |
|---|---|---|
| 1 | 김철수 | 수학, 영어, 과학 |
| 2 | 이영희 | 수학, 국어 |
문제점: 수강과목 컬럼에 여러 값이 들어가 있어서 데이터를 검색하거나 수정하기 어렵다.
정규화 후 (1NF 만족)
| 학생ID | 이름 | 수강과목 |
|---|---|---|
| 1 | 김철수 | 수학 |
| 1 | 김철수 | 영어 |
| 1 | 김철수 | 과학 |
| 2 | 이영희 | 수학 |
| 2 | 이영희 | 국어 |
각 행이 하나의 의미를 가진다.
제2 정규형 (2NF - Second Normal Form)
정의
1NF를 만족하면서, 부분 함수 종속을 제거해야 합니다.
부분 함수 종속: 기본키의 일부만으로도 다른 속성을 결정할 수 있는 경우
예시
정규화 전 (2NF 위반)
| 주문번호 | 상품ID | 상품명 | 가격 | 수량 | 주문일자 |
|---|---|---|---|---|---|
| 1001 | P001 | 노트북 | 1,000,000 | 2 | 2024-01-01 |
| 1001 | P002 | 마우스 | 30,000 | 5 | 2024-01-01 |
| 1002 | P001 | 노트북 | 1,000,000 | 1 | 2024-01-02 |
문제점
- 기본키는 (주문번호, 상품 ID)다
- 하지만 상품명과 가격은 상품 ID만으로도 결정된다 (부분 함수 종속)
- 상품 가격이 변경되면 여러 행을 수정해야 한다
정규화 후 (2NF 만족)
주문 테이블
| 주문번호 | 상품ID | 수량 | 주문일자 |
|---|---|---|---|
| 1001 | P001 | 2 | 2024-01-01 |
| 1001 | P002 | 5 | 2024-01-01 |
| 1002 | P001 | 1 | 2024-01-02 |
상품 테이블
| 상품ID | 상품명 | 가격 |
|---|---|---|
| P001 | 노트북 | 1,000,000 |
| P002 | 마우스 | 30,000 |
상품 정보는 한 곳에서만 관리할 수 있다.
제3 정규형 (3NF - Third Normal Form)
정의
2NF를 만족하면서, 이행적 함수 종속을 제거해야 합니다.
이행적 함수 종속: A → B, B → C이면 A → C인 관계 (B를 거쳐서 종속되는 경우)
예시
정규화 전 (3NF 위반)
| 학생ID | 이름 | 학과코드 | 학과명 | 학과위치 |
|---|---|---|---|---|
| 1 | 김철수 | D001 | 컴퓨터공학과 | 1호관 |
| 2 | 이영희 | D001 | 컴퓨터공학과 | 1호관 |
| 3 | 박민수 | D002 | 경영학과 | 2호관 |
문제점
- 학생 ID → 학과코드 → 학과명, 학과위치 (이행적 함수 종속)
- 학과 정보가 변경되면 여러 학생 행을 수정해야 한다
정규화 후 (3NF 만족)
학생 테이블
| 학생ID | 이름 | 학과코드 |
|---|---|---|
| 1 | 김철수 | D001 |
| 2 | 이영희 | D001 |
| 3 | 박민수 | D002 |
학과 테이블
| 학과코드 | 학과명 | 학과위치 |
|---|---|---|
| D001 | 컴퓨터공학과 | 1호관 |
| D002 | 경영학과 | 2호관 |
학과 정보는 학과 테이블에서만 관리한다.
정규화의 핵심 원칙
- 하나의 테이블은 하나의 주제만 다룬다
- 중복 데이터를 제거한다
- 관계를 명확히 정의한다 (외래키 사용)
정규화의 단점
과도한 정규화는 JOIN 연산이 많아져서 성능이 저하될 수 있다.
- 역정규화(Denormalization): 성능 향상을 위해 의도적으로 정규화를 완화하는 경우도 있다
- 하지만 먼저 정규화를 하고, 성능 문제가 발생하면 그때 역정규화를 고려하는 것이 좋다
정리
정규화는 데이터베이스 설계의 기본 개념이다. 1NF, 2NF, 3NF 단계를 통해 데이터 중복을 제거하고 무결성을 보장할 수 있다.
제1 정규형(1NF)
하나의 칼럼에는 하나의 값만 저장해야 하며,
여러 값이 한 컬럼에 저장되는 중복·반복 속성 문제를 해결한다.
제2 정규형(2NF)
기본키의 **일부에만 종속되는 속성(부분 함수 종속)**을 제거한다.
즉, 복합 기본키 중 일부로 결정되는 속성들을 분리하는 것이 목적이다.
→ 1 정규형을 만족하면서, 기본키 전체에 종속되도록 만든다.
제3 정규형(3NF)
이행적 함수 종속을 제거한다.
기본키가 아닌 속성에 간접적으로 종속된 속성들을 분리하여
모든 일반 속성이 오직 기본키에만 직접 종속되도록 한다.