728x90
※ IT: RDBMS Denormalization.
안녕하세요. 듀스트림입니다.
정규화에 이어서 오늘은 반정규화입니다.
반정규화(Denormalization)?
정규화된 테이블을 성능과 운영 효율성 향상 등을 위해 의도적으로 중복을 허용하고 정규형 제약을 완화하는 설계 기법입니다.
- 데이터 무결성보다 조회 성능을 우선시
- JOIN 횟수 최소화 → I/O 줄이기
- 분석, 집계, 보고 시스템 등에서 사용
반정규화가 필요한 이유
| 정규화 문제점 | 반정규화가 필요한 이유 |
| JOIN이 너무 많음 | 복잡한 쿼리로 인해 응답 시간 증가 |
| Index 사용률 저하 | Join Key와 Predicate 불일치 시 인덱스 효과 ↓ |
| 다중 테이블 업데이트 | 업무 로직상 자주 조회되는 정보를 한 테이블로 합침 |
| 통계 집계 성능 저하 | 반복적인 집계를 미리 계산해서 저장 |
| 비정형 또는 로깅 테이블 | JSON 형태, 로그성 데이터는 정규화에 불리 |
반정규화 유형과 예시
| 유형 | 설명 | 예시 |
| 테이블 병합 | 자주 JOIN 되는 테이블을 하나로 병합 | 주문 + 고객 → 주문_고객 테이블 |
| 중복 컬럼 추가 | 다른 테이블의 Key/Name 등을 중복 저장 | Employee 테이블에 부서명 직접 포함 |
| 파생 컬럼 추가 | 계산 결과를 미리 컬럼으로 보관 | 매출금액 = 수량 * 단가 저장 |
| 집계 컬럼 저장 | COUNT, SUM, AVG 등을 별도 테이블 또는 컬럼으로 유지 | 게시글에 댓글 수 필드 유지 |
| 이력/스냅샷 테이블 | 조회 시점의 상태 유지 | 일일 단위 사용자 활동 스냅샷 저장 |
| 중첩 구조(JSON 등) | 정규화 대신 구조체 저장 | PostgreSQL의 JSONB 컬럼 사용 |
| 테이블 분할 | 자주 조회되는 열만 따로 분리 (가역적 분해) | 고객 테이블을 기본정보, 마케팅 동의로 분리 |
반정규화의 장단점
장점
- 조회 속도 개선 (JOIN 제거)
- 쿼리 단순화 → 유지보수 편리
- 집계 데이터 처리 효율화
- 분석·BI Tool 친화적
단점
- 데이터 중복 → 일관성 유지 어려움
- 업데이트 비용 증가 → 하나의 변경이 여러 테이블에 영향을 줄 수 있음
- 트랜잭션/트리거/ETL 관리 필요
- 디스크 공간 증가
반정규화 적용 판단 기준
| 기준 | 설명 |
| 조회가 압도적으로 많음 | 반정규화 고려 |
| JOIN 테이블 수 5개 이상 | 성능 병목 발생 가능으로 반정규화 고려 |
| 집계 쿼리 반복 실행 | Materialized View, Summary Table 고려 |
| 최종 사용자가 쿼리 복잡도 어려움 | 구조 단순화 필요 |
| 정규화 구조가 너무 깊음 | Depth 3 이상 → View 또는 병합 고려 |
| 무결성보다 실시간 조회 중요 | 캐시 테이블, 반정규화 테이블 활용 |
PostgreSQL에서 반정규화 활용 전략
| 전략 | 설명 |
| 물리적 View → Materialized View | 집계 결과를 저장해 두고 REFRESH 주기로 갱신 |
| 중복 저장 시 트리거(TRIGGER) | 데이터 무결성을 위한 자동 갱신 |
| JSONB | 구조화된 속성의 유연한 저장과 인덱싱 지원 |
| PARTITIONING + SUMMARY | 시간 파티션 + 파티션별 요약 테이블 활용 |
| UNLOGGED Table / Cache Table | 빈번 조회용 테이블은 별도로 운영 |
| Foreign Table / FDW + Denormalized Replica | 외부 시스템과의 연결에서도 반정규화 버전 제공 가능 |
반정규화 예시
▸ 정규화 구조
-- 주문
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INT,
order_date DATE
);
-- 고객
CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,
customer_name TEXT,
region TEXT
);
▸ 반정규화 구조
CREATE TABLE order_summary (
order_id SERIAL PRIMARY KEY,
customer_id INT,
customer_name TEXT,
region TEXT,
order_date DATE
);→ customer_name, region을 중복 저장
→ 주문 내역 조회 시 JOIN 불필요
정규화와 반정규화 비교 요약
| 정규화 | 반정규화 |
| 중복 제거, 이상 방지 | 성능 향상, 단순화 |
| 설계 원칙 중심 | 실용과 운영 중심 |
| 변경·추적에 유리 | 읽기 성능에 유리 |
| JOIN 많아질 수 있음 | 쿼리 단순화, 속도 향상 |
결론적으로 정규화와 반정규화는 데이터 품질과 서비스 속도 향상의 Trade-off입니다.
오늘은 여기까지~
728x90
'IT 여러가지' 카테고리의 다른 글
| IT: for Loop vs while Loop (0) | 2025.07.13 |
|---|---|
| IT: RDBMS 스타스키마 (1) | 2025.07.09 |
| IT: RDBMS 정규화 (2) | 2025.07.07 |
| IT: 데이터 이행 (1) | 2025.05.25 |
| IT: 데이터 클렌징 (0) | 2025.05.25 |