반정규화는 무엇인가요?
f
firststep 에디터
IT / 자격증 전문 라이터
2026년 2월 21일729
반정규화는 무엇인가요?
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
f
firststep 에디터 · IT / 자격증 전문 라이터
firststep.kr의 실무 에디터로서 무언가를 처음 도전하는 분들이 헤매지 않도록 검증된 지식과 실습 가이드를 작성합니다.
댓글 0개
댓글을 작성하려면 로그인이 필요합니다
간단한 이메일과 비밀번호로 3초 만에 가입하고 의견을 남겨보세요.
첫 번째 댓글을 남겨보세요!