개발일지

데이터 모델링에서 정규화란? 본문

IT공부/SQL

데이터 모델링에서 정규화란?

Johnnnn 2025. 8. 1. 17:01

데이터베이스 설계를 할 때 꼭 알아야 하는 개념 중 하나가 바로 **정규화(Normalization)**이다.
정규화는 데이터를 중복 없이, 일관성 있게, 효율적으로 저장하기 위해 테이블 구조를 정리하는 작업이다.

 

✅ 정규화를 왜 해야 할까?

  • 같은 정보가 여러 곳에 반복되면 수정할 때 오류가 발생하기 쉽다.
  • 중복된 데이터는 저장 공간 낭비로 이어진다.
  • 테이블이 복잡하면 유지보수가 어려워진다.

이러한 문제를 예방하기 위해 정규화 과정을 통해 데이터를 구조화해야 한다.

 

📚 정규화의 3단계: 1NF → 2NF → 3NF

정규화는 단계별로 적용하며, 각 단계는 이전보다 더 철저한 정리를 목표로 한다.

 

🧱 1정규화 (1NF) – "한 칸엔 한 값만 있어야 한다"

- 테이블의 컬럼이 원자성(한 속성이 하나의 값을 갖는 특성)을 갖도록 테이블을 분해하는 단계

- 쉽게 말해 하나의 행과 컬럼의 값이 반드시 한 값만 입력되도록 행을 분리하는 단계

❌ 정규화 전

학생 id 이름 과목
1 철수 수학, 영어
2 영희 과학
 

위 예시는 과목 칸에 여러 값이 들어 있는 상태이다.
한 칸에 여러 값을 넣으면 검색이나 수정이 어려워진다.

✅ 정규화 후

학생ID 이름  과목
1 철수 수학
1 철수 영어
2 영희 과학
 

한 칸에는 하나의 값만 있도록 나누는 것이 1정규화이다.

🧩 2정규화 (2NF) – "부분이 아닌 전체 키에만 의존해야 한다"

- 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만들도록 테이블을 분해

- 완전 함수 종속이란, 기본키를 구성하는 모든 컬럼의 값이 다른 컬럼을 결정짓는 상태

- 기본키의 부분 집합이 다른 컬럼과 1:1 대응 관계를 갖지 않는 상태를 의미

- 즉, PK(Primary Key)가 2 개 이상일 때 발생하며 PK 의 일부와 종속되는 관계가 있다면 분리한다.

❌ 정규화 전

학생ID 과목명 교수이름
1 수학 김교수
1 영어 이교수
2 수학 김교수
 

이 테이블의 기본키는 (학생ID, 과목명)이다.
하지만 교수이름은 오직 과목명에만 관련돼 있으므로, 따로 분리해야 한다.

✅ 정규화 후

수강 테이블

학생ID 과목명
1 수학
1 영어
2 수학

 

 

과목 테이블

과목명 교수이름
수학 김교수
영어 이교수
 

이렇게 나누면 모든 컬럼이 기본키 전체에 의존하게 되어 2정규화를 만족한다.

🔗 3정규화 (3NF) – "간접적인 의존성도 제거해야 한다"

- 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분리

- 이행적 종속성이란 A -> B, B-> C 의 관계가 성립할 때, A -> C 가 성립되는 것을 말함

- (A,B)와 (B,C)로 분리하는 것이 제 3 정규화

❌ 정규화 전

학생ID 학과 학과사무실
1 컴퓨터 101호
2 경영 202호
 

여기서 학과사무실은 학과에 의존하는 정보이다.
즉, 학생ID → 학과 → 학과사무실이라는 간접적인 의존이 존재한다.

✅ 정규화 후

학생 테이블

학생 id 학과
1 컴퓨터
2 경영
 

학과 테이블

학과 학과 사무실
컴퓨터 101호
경영 202호
 

이처럼 간접적인 의존성을 제거하여 테이블을 분리하면 3정규화를 만족한다.

📌 한눈에 정리하기

정규화 단계 핵심 개념
1NF 한 칸엔 한 값만 있어야 한다
2NF 기본키 전체에만 의존해야 한다
3NF 간접적인 의존 관계도 제거해야 한다
 
✅ 마무리

정규화는 데이터베이스를 깔끔하게 설계하기 위한 기본 원칙이다.
처음에는 복잡해 보일 수 있지만, 중복을 줄이고 일관성을 유지하기 위해 꼭 필요한 과정이다.