본문 바로가기
프로그래밍

정규화와 이상 현상: 데이터 구조를 더 깔끔하고 안정적으로 만드는 법

by 유형제맘 2025. 8. 1.

데이터베이스 설계에서 가장 자주 듣게 되는 말 중 하나가 바로 "정규화(Normalization)"입니다. 정규화는 단순한 이론이 아니라, 현실 세계의 데이터 이상 현상을 방지하고 구조를 정리하는 강력한 도구입니다. 이번 글에서는 정규화의 개념과 각 단계, 그리고 정규화를 하지 않으면 어떤 문제가 발생하는지 쉽게 설명해보겠습니다.

1. 정규화란 무엇인가?

정규화는 데이터의 중복을 제거하고, 데이터 간의 논리적인 관계를 명확히 하기 위한 데이터베이스 구조화 과정입니다.

 

정규화의 목적

  • 중복 데이터 제거
  • 데이터 무결성 유지
  • 이상 현상 방지
  • 구조의 일관성과 유지보수성 향상

2. 정규화를 하지 않으면 생기는 문제: 이상 현상(Anomaly)

정규화가 왜 중요한지를 이해하려면, 먼저 이상 현상이 무엇인지 알아야 합니다.

 

삽입 이상 (Insertion Anomaly)

  • 특정 정보를 추가하지 못하는 현상
  • 예: 학생 테이블에 과목 정보가 없어 학생을 등록할 수 없음

삭제 이상 (Deletion Anomaly)

  • 한 데이터를 삭제하면 관련된 다른 정보도 함께 사라짐
  • 예: 한 학생을 삭제했더니, 해당 과목 정보도 같이 사라짐

갱신 이상 (Update Anomaly)

  • 동일한 정보를 여러 곳에 기록 → 수정 시 누락 위험
  • 예: 교수 연락처가 여러 행에 존재 → 한 곳만 수정되면 정보 불일치

이러한 문제들은 모두 테이블에 중복 데이터가 존재할 때 발생합니다. 이걸 방지해주는 것이 바로 정규화입니다.

3. 정규화의 단계 (1NF ~ 3NF)

제1정규형 (1NF)

  • 원자값(Atomic Value)만 저장
  • 즉, 컬럼 안에 리스트나 복합값 금지
  • 반복되는 그룹 제거
잘못된 예: 과목 = “영어, 수학”
올바른 예: 각 과목을 별도 행으로 분리

 

제2정규형 (2NF)

  • 1NF를 만족하고
  • 부분 함수 종속 제거 (기본키의 일부분에만 종속된 컬럼 제거)
[학생ID, 과목코드] → 성적  ✅  
[학생ID] → 이름 ❌ (부분 종속)

→ 학생 정보를 별도 테이블로 분리!

 

제3정규형 (3NF)

  • 2NF를 만족하고
  • 이행적 종속 제거 (A → B, B → C일 때 A → C 제거)
[학생ID] → [학과코드] → [학과명] ❌  
→ 학과 정보를 별도 테이블로 분리

 

그 외 고급 정규화 (시험에서 출제 빈도 낮음)

  • BCNF (보이스-코드 정규형)
  • 제4정규형, 제5정규형

4. 정규화와 성능의 균형

정규화는 데이터 구조의 정합성을 높여주지만, 너무 많이 정규화하면 JOIN이 많아져 성능 저하가 발생할 수 있습니다.
그래서 현실에서는?

  • 업데이트가 자주 발생하는 OLTP 시스템 → 정규화 선호
  • 조회 위주인 OLAP 시스템 → 일부 비정규화 적용

정규화와 비정규화의 균형은 시스템 목적에 따라 결정되어야 합니다.

마무리 및 요약

  • 정규화는 중복을 제거하고 이상 현상을 방지하는 데이터 모델링 기법입니다.
  • 제1정규형부터 제3정규형까지는 실무와 시험에서 모두 중요합니다.
  • 하지만 무조건 정규화만 고집하지 말고, 상황에 따라 비정규화도 고려해야 합니다.

🎯 TIP: SQLD 시험에서는 정규화 단계별 정의와 이상 현상 예시가 자주 출제됩니다.
"어떤 현상이 발생했는가?" 또는 "이 테이블은 몇 정규형인가?"라는 유형이 대표적입니다.