데이터베이스 정규화 (Normalization)

데이터베이스를 설계하다 보면 '데이터베이스를 나누는 기준'에 대한 고민이 생긴다.
이걸 정립해주는 개념이 정규화(Normalization)이다.

정규화란

데이터의 중복을 줄이고, 이상 현상을 방지하기 위해 테이블을 구조적으로 나누는 과정

정규화를 해야하는 이유

정규화를 하지 않았을 경우 발생하는 문제에 대해서 살펴보자.


❌ 1. 중복 데이터 발생

학생 | 과목 | 교수
------------------
A    | DB   | Kim
A    | OS   | Lee

👉 학생 A가 여러 번 반복됨


❌ 2. 수정 이상 (Update Anomaly)

교수 이름이 바뀌면?

👉 모든 행을 다 수정해야 한다

→ 하나라도 빠지면 데이터 불일치 발생


❌ 3. 삽입 이상 (Insert Anomaly)

새로운 과목을 추가하려는데 학생이 없다면?

👉 데이터를 넣을 수 없음


❌ 4. 삭제 이상 (Delete Anomaly)

학생 A를 삭제하면?

👉 해당 과목 정보까지 같이 사라짐


이러한 문제 발생을 방지하기 위하여 정규화를 사용한다.

정규화의 목적

정규화는 단순히 테이블을 나누는 것이 아니다.

데이터를 일관성 있고 효율적으로 관리하기 위한 구조를 만드는 과정이다.
  • 데이터 중복 제거
  • 이상 현상 방지 (Update / Insert / Delete)
  • 데이터 무결성 유지
  • 유지보수 용이성 향상

정규화 과정

정규화는 단계적으로 진행되며, 일반적으로 제3정규형(3NF)까지 적용한다.

1️⃣ 제1정규형 (1NF)

👉 모든 컬럼은 원자값(Atomic Value)을 가져야 한다


❌ 정규화 전

학생 | 전화번호
------------------------
A    | 010-1111, 010-2222

👉 하나의 컬럼에 여러 값이 존재


✅ 정규화 후

학생 | 전화번호
------------------------
A    | 010-1111
A    | 010-2222

👉 하나의 컬럼에는 하나의 값만 존재


2️⃣ 제2정규형 (2NF)

부분 함수 종속 제거

👉 기본키의 일부에만 의존하는 컬럼 제거

❌ 정규화 전

학생ID | 과목ID | 학생이름
---------------------------
1       | DB     | Kim
1       | OS     | Kim

👉 학생이름은 학생ID에만 의존


✅ 정규화 후

학생 테이블
학생ID | 이름
------------
1      | Kim

수강 테이블
학생ID | 과목ID
-------------
1      | DB
1      | OS

👉 테이블을 분리하여 중복 제거


3️⃣ 제3정규형 (3NF)

이행 함수 종속 제거

👉 기본키가 아닌 컬럼이 다른 컬럼에 의존하는 경우 제거

❌ 정규화 전

학생ID | 학과ID | 학과명
-------------------------
1      | 10     | 컴퓨터공학

👉 학과명은 학과ID에 의존


✅ 정규화 후

학생
학생ID | 학과ID

학과
학과ID | 학과명

👉 관계를 분리하여 구조 개선


하지만 이런 정규화에도 한계는 있다.
너무 많이 나누게 되면

  • JOIN 증가
  • 쿼리 성능 저하
  • 구조 복잡도 증가

이런 경우에는 반정규화(Denormalization)를 고려하기도 한다.

profile
다른 건 노력의 시간

0개의 댓글