본문 바로가기
데이터 모델과 SQL

[SQL 이해하기] - 6. 반정규화

by 영바이트 2023. 5. 26.

정규화(normalization가 정보의 일관성(consistency)을 위해 테이블 사이의 중복을 최대한 줄이는 작업이었다면 반정규화(de-normalization)는 엔터티(테이블)의 조회(SELECT) 성능을 높이기 위해 부득이 중복을 허용하는 작업이다. 반정규화를 살펴보기 전에 헷갈리기 쉬운 개념인 일관성과 일치성에 대해 먼저 살펴보자.

 

- 일관성(consistency): 어떤 데이터가 시간이 지나도 계속 유효한 상태로 유지되는 것이다.

- 일치성(integrity): 데이터와 데이터가 가리키는 실체가 동일한 것을 일컫는다.

 

따라서 일관성은 일치성의 개념에 시간 관점이 더해진 것이라고 볼 수 있다. 이제 반정규화에 대해 살펴보자.

 

1. 테이블 반정규화

테이블 병합 1:1관계 테이블 병합 예) 회원 + 회원상세 → 회원
1:M관계 테이블 병합 예) 주문 + 주문상품 → 주문상세
수퍼-서브관계 테이블 병합 예) 상품 + 상품상세 → 상품정보
테이블 분할 테이블 수직(속성) 분할 예) 회원 → 회원 + 회원가족
테이블 수평 분할 예) 속성을 기준으로 파티셔닝
테이블 추가 중복 테이블 추가 예) 주문 → 주문이력 + 당일주문
통계 테이블 추가 예) 주문 테이블에 주문 총금액 속성 추가
이력 테이블 추가 예) 상품가격 이력 테이블
부분 테이블 추가 예) 회원 → 회원(연락처 포함) + 회원연락처

 

2. 컬럼 반정규화

ⓐ 중복 컬럼 추가: JOIN이 많은 경우 JOIN을 없애기 위해 중복 컬럼을 허용하는 경우이다.

ⓑ 파생 컬럼 추가: 상품의 재고, 할인가 등을 계산한 컬럼을 허용하는 경우이다.

ⓒ 이력 테이블 추가: 이력 테이블의 내용을 요약한 컬럼(예, 최근 변경일)을 추가하는 경우이다.

 

3. 관계 반정규화(중복 관계 추가)

JOIN이 잦지만 JOIN 경로가 긴 경우 테이블 조회 성능이 나빠진다. JOIN 대상을 직접 연결하는 컬럼을 추가하여 JOIN 경로를 줄이는 경우에 해당한다. 컬럼을 추가하기는 하지만 중복 데이터는 아닌 경우도 있기 때문에 반드시 일관성을 낮춘다고만 볼 수 없는 반정규화이다.

 

만약 아래와 같은 관계에서 회원-배송 테이블 사이의 JOIN이 많다고 하면 이 두 테이블 사이에 관계를 나타내는 속성을 추가하여 JOIN 성능을 개선할 수 있다.

관계 반정규화 이전: 회원 - 배송 간 JOIN 경로 길이 = 3

 

관계 반정규화 이후: 회원 - 배송 간 JOIN 경로 길이 = 1

 

댓글