sqld
반정규화는 무엇인가요?
자격증원톱
2026. 2. 21. 11:31
반응형
반정규화는 무엇인가요?
반응형

1) 반정규화란?
- 정규화는 “중복 제거 + 테이블 분리”였죠.
- 반정규화는 그 반대입니다.
성능을 위해 일부 중복을 의도적으로 허용하거나, 분리된 테이블을 합쳐 구조를 단순화합니다.
한 줄 정의
- “조회 성능/쿼리 단순화가 더 중요할 때 일부 중복을 감수하는 설계”
2) 반정규화를 고려하는 상황(언제 쓰나?)
이미지 요지는 3가지입니다.
- 조회 성능이 너무 느릴 때
- 정규화된 테이블을 조인(join) 많이 하면 느려질 수 있음
- 읽기가 많은 시스템(대시보드/통계/리포트)에 특히 효과적
- 쿼리가 너무 복잡할 때
- 여러 테이블 조인/서브쿼리로 개발·운영이 어려움
- 한 테이블에서 바로 뽑게 만들면 단순해짐
- 트랜잭션 처리 시간이 문제일 때
- 조인/집계가 많아 처리 시간이 늘어나면 병목이 생김
- 미리 계산해 저장하면 빨라짐
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 실행 순서
- FROM : 어떤 테이블에서 가져올지
- WHERE : 조건으로 행(레코드) 먼저 걸러내기
- GROUP BY : 그룹 만들기
- HAVING : 그룹에 조건 걸기
- SELECT : 최종 출력 컬럼 결정
- 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
반응형