sqld

반정규화는 무엇인가요?

자격증원톱 2026. 2. 21. 11:31
반응형

반정규화는 무엇인가요?

반응형

 

1) 반정규화란?

  • 정규화는 “중복 제거 + 테이블 분리”였죠.
  • 반정규화는 그 반대입니다.
    성능을 위해 일부 중복을 의도적으로 허용하거나, 분리된 테이블을 합쳐 구조를 단순화합니다.

한 줄 정의

  • “조회 성능/쿼리 단순화가 더 중요할 때 일부 중복을 감수하는 설계”

2) 반정규화를 고려하는 상황(언제 쓰나?)

이미지 요지는 3가지입니다.

  1. 조회 성능이 너무 느릴 때
  • 정규화된 테이블을 조인(join) 많이 하면 느려질 수 있음
  • 읽기가 많은 시스템(대시보드/통계/리포트)에 특히 효과적
  1. 쿼리가 너무 복잡할 때
  • 여러 테이블 조인/서브쿼리로 개발·운영이 어려움
  • 한 테이블에서 바로 뽑게 만들면 단순해짐
  1. 트랜잭션 처리 시간이 문제일 때
  • 조인/집계가 많아 처리 시간이 늘어나면 병목이 생김
  • 미리 계산해 저장하면 빨라짐

3) 반정규화 방법(어떻게 하나?)

이미지에 나온 대표 방법 3가지입니다.

① 테이블 병합(Join 줄이기)

  • 관련 테이블을 하나로 합쳐 조인을 줄임

예시(고객 + 고객등급)

  • 정규화: 고객(customer) / 등급(grade) 분리
  • 반정규화: 고객 테이블에 grade_name을 같이 저장

② 중복 컬럼 추가(자주 쓰는 값 복사)

  • 조회할 때 자주 필요한 값을 다른 테이블에도 복사 저장

예시(주문 + 고객명)

  • 원래는 주문에서 고객명을 보려면 고객 테이블 조인이 필요
  • 주문 테이블에 customer_name을 같이 저장하면 조인 없이 조회 가능
  • 대신 고객명이 바뀌면 주문 쪽도 같이 갱신해야 함(관리 비용 증가)

③ 집계 데이터 미리 저장(미리 계산해 두기)

  • 매번 SUM, AVG, COUNT 계산하지 않고 결과를 저장

예시(상품별 판매량)

  • 매번 주문상세를 그룹핑해서 판매량을 구하면 느림
  • product_sales_summary(product_id, total_qty, total_amount) 같은 집계 테이블을 만들어 주기적으로 갱신

4) 반정규화 시 주의할 점(중요)

반정규화는 “성능” 대신 “정합성/관리” 비용이 올라갑니다.

  • 데이터 불일치 위험(무결성 저하)
    • 같은 정보가 여러 곳에 있어 업데이트 누락되면 값이 달라짐
  • 유지보수 난이도 증가
    • 중복이 많아질수록 수정 로직이 복잡해짐
  • 그래서 원칙은
    정규화로 설계 → 느린 조회/복잡 쿼리가 ‘진짜 문제’일 때만 최소 범위로 반정규화

5) SQL 실행 순서 요약

이미지에 나온 “쿼리는 이렇게 처리된다”는 순서입니다.

 

SQL 실행 순서

  1. FROM : 어떤 테이블에서 가져올지
  2. WHERE : 조건으로 행(레코드) 먼저 걸러내기
  3. GROUP BY : 그룹 만들기
  4. HAVING : 그룹에 조건 걸기
  5. SELECT : 최종 출력 컬럼 결정
  6. ORDER BY : 정렬

예시(요리별 주문 5건 이상만, 주문수 내림차순)

SELECT 요리이름, COUNT(*) AS 주문수
FROM 주문내역
WHERE 날짜 = '2024-07-22'
GROUP BY 요리이름
HAVING COUNT(*) > 5
ORDER BY 주문수 DESC;
 
 

초간단 요약

  • 반정규화 = 성능 때문에 일부 중복/병합/집계를 허용하는 설계
  • 쓰는 이유: 조회 빠르게, 쿼리 단순하게
  • 방법: 테이블 병합 / 중복 컬럼 추가 / 집계 결과 저장
  • 단점: 정합성 깨질 위험 + 유지보수 비용 증가
  • SQL 실행 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
반응형