Post

데이터모델링 - 정규화/반정규화

데이터모델링 - 정규화/반정규화

🎯데이터모델링 - 정규화/반정규화

데이터베이스 설계에서 중요한 개념 중 하나가 바로 정규화(Normalization)반정규화(Denormalization) 이다.
정규화는 데이터 중복과 이상현상(Anomaly)을 제거하기 위한 기법이고, 반정규화는 성능 향상이나 운영 효율성을 위해 정규화를 의도적으로 완화하는 과정이다.

1. 정규화 (Normalization)

정의

관계형 데이터베이스에서 데이터의 중복을 최소화하고 무결성을 보장하기 위해 테이블을 분해하는 과정이다.

정규화 단계

단계설명특징
1NF (제1정규형)원자값으로 분해반복 속성 제거
2NF (제2정규형)부분 종속 제거복합키 → 부분 종속 제거
3NF (제3정규형)이행 종속 제거기본키가 아닌 속성 간 종속 제거
BCNF모든 결정자가 후보키더 엄격한 제약

예시

0단계 (비정규화된 상태)

주문(주문ID, 고객ID, 고객명, 주소, 주문일자, 상품ID, 상품명, 단가, 수량)

한 테이블 안에 고객 + 주문 + 상품 정보가 모두 들어 있음

  • 문제점
    • 고객 주소 변경 시, 해당 고객이 주문한 모든 행을 수정해야 함 (갱신 이상)
    • 상품명이 바뀌면 역시 모든 주문 레코드를 수정해야 함 (갱신 이상)
    • 신규 고객을 추가하려면 주문ID도 필요해 추가 불가 (삽입 이상)
    • 주문 삭제 시 고객 정보까지 함께 사라짐 (삭제 이상)

1NF (제1정규형) – 원자값 보장

  • 주소를 “시/도 + 구 + 도로명” 으로 나눔 → 원자값 보장

변경 후 테이블

주문(주문ID, 고객ID, 고객명, 시도, 구, 도로명, 주문일자, 상품ID, 상품명, 단가, 수량)

→ 이제 주소 컬럼이 더 이상 복합값을 갖지 않음.

2NF (제2정규형) - 부분 종속 제거

  • 현재 기본키 후보 : (주문ID, 상품ID) → 주문 1건에 여러 상품이 들어올 수 있기 떄문에.
  • 문제 : 상품명, 단가는 상품ID에만 종속됨 → 부분 종속 발생
  • 해결 : 상품 테이블 분리

변경 후 테이블

주문(주문ID, 고객ID, 주문일자)

주문상세(주문ID, 상품ID, 수량)

상품(상품ID, 상품명, 단가)

→ 상품명, 단가는 상품ID 기준으로만 관리 → 데이터 중복 제거

3NF (제3정규형) – 이행 종속 제거

  • 문제: 고객명, 시도, 구, 도로명은 고객ID에 종속 → 주문 테이블에 두면 이행 종속 발생
  • 해결: 고객 테이블 분리

최종 구조

고객(고객ID, 고객명, 시도, 구, 도로명)

주문(주문ID, 고객ID, 주문일자)

주문상세(주문ID, 상품ID, 수량)

상품(상품ID, 상품명, 단가)

→ 이제 모든 속성은 기본키에만 직접 종속 → 이상현상 제거 + 무결성 보장

결과

  • 1NF : 주소를 세부 컬럼으로 분리 → 원자값 보장
  • 2NF : 상품 정보를 별도 테이블로 분리 → 부분 종속 제거
  • 3NF : 고객 정보를 별도 테이블로 분리 → 이행 종속 제거

장단점 요약

  • 장점:
    • 데이터 중복 최소화
    • 삽입/삭제/갱신 이상현상 제거
    • 무결성 보장
  • 단점:
    • 테이블 수 증가 → Join 연산 과다
    • 조회 성능 저하 가능

2. 반정규화 (Denormalization)

정의

조회 성능을 높이고, 개발 편의성을 확보하기 위해 정규화를 일부 해제하는 과정이다.

주요 기법

기법설명예시
테이블 병합자주 Join하는 마스터/상세 테이블 통합주문 + 주문상세 통합
테이블 분할수평/수직 분할로 성능 향상대량 데이터 → 기간별 테이블 분할
중복 컬럼 추가합계, 카운트 값 저장주문건수, 재고수량 컬럼
파생 데이터 저장계산식 결과 미리 저장총금액 = 단가 * 수량

예시

정규화가 끝난 상태의 테이블

고객(고객ID, 고객명, 시도, 구, 도로명)

주문(주문ID, 고객ID, 주문일자)

주문상세(주문ID, 상품ID, 수량)

상품(상품ID, 상품명, 단가)

→ 이 구조는 무결성 보장에는 좋지만, 주문 조회 시에는 항상 다중 조인이 필요하다.

예시

1
2
3
4
5
6
SELECT C.고객명, O.주문일자, SUM(P.단가 * OD.수량) AS 총금액
FROM 주문 O
JOIN 고객 C ON O.고객ID = C.고객ID
JOIN 주문상세 OD ON O.주문ID = OD.주문ID
JOIN 상품 P ON OD.상품ID = P.상품ID
GROUP BY C.고객명, O.주문일자;

고객명 중복 저장

  • 주문 테이블에 고객명을 추가 저장
  • 고객 정보를 위해 JOIN 고객을 하지 않아도 됨

주문(주문ID, 고객ID, 고객명, 주문일자)

장점

  • 조회 속도 향상

단점

  • 고객명이 변경되면 주문 테이블 전체를 수정해야 함 → 갱신 이상

총금액 파생 컬럼 추가

  • 주문 테이블에 총금액 컬럼을 별도로 추가

주문(주문ID, 고객ID, 주문일자, 총금액)

장점

  • 매번 SUM(단가 * 수량) 계산할 필요 없음
  • 보고서 조회, 통계 처리 시 빠름

단점

  • 주문상세 변경 시 총금액을 반드시 동기화해야 함 → 무결성 관리 부담

주문 + 주문상세 테이블 병합

  • 주문과 주문상세를 합쳐 하나의 테이블로 구성

주문내역(주문ID, 고객ID, 고객명, 주문일자, 상품ID, 상품명, 단가, 수량, 총금액)

장점

  • 하나의 테이블에서 모든 주문 데이터 조회 가능
  • 보고서, 통계, 대량 조회 시 유리

단점

  • 데이터 중복 증가
  • 고객명, 상품명 변경 시 대량 Update 필요

결과

  • 정규화 : 중복 최소화, 무결성 ↑, 성능 ↓
  • 반정규화 : 성능 ↑, 관리 편의성 ↑, 무결성 ↓

결국, 반정규화는 성능과 편의성을 위해 무결성을 일부 희생 하는 것이라고 생각한다.

장단점 요약

  • 장점:
    • 조회 성능 개선
    • SQL 단순화
    • 응답 속도 향상
  • 단점:
    • 데이터 중복 발생
    • 무결성 관리 비용 증가
    • 갱신 부하

3. 정규화 vs 반정규화 비교

구분정규화반정규화
목적무결성 보장, 이상현상 제거성능 향상, 단순화
데이터 중복최소화의도적 허용
무결성높음낮음
성능조회 성능 저하 가능조회 성능 향상
적용 시점설계/분석 단계구현/튜닝 단계

4. 결론

  • 정규화는 데이터 품질과 무결성을 위한 필수 과정
  • 반정규화는 성능 최적화를 위한 선택적 과정
  • 즉, 정규화 → 기본 원칙, 반정규화 → 상황에 따른 예외적 적용

데이터모델링은 이 두 가지를 적절히 조화시키는 것이 중요하다.
분석 단계에서는 철저히 정규화하여 논리적 모델을 만들고, 실제 운영 단계에서는 > 성능 이슈에 맞추어 필요한 부분만 반정규화를 적용해야 한다.

조회 성능이 중요한 BI, 리포트, 트랜잭션 처리 시스템에서는 반정규화 적극 활용 데이터 무결성이 더 중요한 금융/안전/공공 시스템에서는 정규화 유지 —

📚 참고자료

  • C.J. Date, Database System Concepts
  • 한국데이터산업진흥원, 데이터모델링 표준 가이드라인
This post is licensed under CC BY 4.0 by the author.