정규화(normalization가 정보의 일관성(consistency)을 위해 테이블 사이의 중복을 최대한 줄이는 작업이었다면 반정규화(de-normalization)는 엔터티(테이블)의 조회(SELECT) 성능을 높이기 위해 부득이 중복을 허용하는 작업이다. 반정규화를 살펴보기 전에 헷갈리기 쉬운 개념인 일관성과 일치성에 대해 먼저 살펴보자.
- 일관성(consistency): 어떤 데이터가 시간이 지나도 계속 유효한 상태로 유지되는 것이다.
- 일치성(integrity): 데이터와 데이터가 가리키는 실체가 동일한 것을 일컫는다.
따라서 일관성은 일치성의 개념에 시간 관점이 더해진 것이라고 볼 수 있다. 이제 반정규화에 대해 살펴보자.
1. 테이블 반정규화
테이블 병합 | 1:1관계 테이블 병합 | 예) 회원 + 회원상세 → 회원 |
1:M관계 테이블 병합 | 예) 주문 + 주문상품 → 주문상세 | |
수퍼-서브관계 테이블 병합 | 예) 상품 + 상품상세 → 상품정보 | |
테이블 분할 | 테이블 수직(속성) 분할 | 예) 회원 → 회원 + 회원가족 |
테이블 수평 분할 | 예) 속성을 기준으로 파티셔닝 | |
테이블 추가 | 중복 테이블 추가 | 예) 주문 → 주문이력 + 당일주문 |
통계 테이블 추가 | 예) 주문 테이블에 주문 총금액 속성 추가 | |
이력 테이블 추가 | 예) 상품가격 이력 테이블 | |
부분 테이블 추가 | 예) 회원 → 회원(연락처 포함) + 회원연락처 |
2. 컬럼 반정규화
ⓐ 중복 컬럼 추가: JOIN이 많은 경우 JOIN을 없애기 위해 중복 컬럼을 허용하는 경우이다.
ⓑ 파생 컬럼 추가: 상품의 재고, 할인가 등을 계산한 컬럼을 허용하는 경우이다.
ⓒ 이력 테이블 추가: 이력 테이블의 내용을 요약한 컬럼(예, 최근 변경일)을 추가하는 경우이다.
3. 관계 반정규화(중복 관계 추가)
JOIN이 잦지만 JOIN 경로가 긴 경우 테이블 조회 성능이 나빠진다. JOIN 대상을 직접 연결하는 컬럼을 추가하여 JOIN 경로를 줄이는 경우에 해당한다. 컬럼을 추가하기는 하지만 중복 데이터는 아닌 경우도 있기 때문에 반드시 일관성을 낮춘다고만 볼 수 없는 반정규화이다.
만약 아래와 같은 관계에서 회원-배송 테이블 사이의 JOIN이 많다고 하면 이 두 테이블 사이에 관계를 나타내는 속성을 추가하여 JOIN 성능을 개선할 수 있다.
■
'데이터 모델과 SQL' 카테고리의 다른 글
[SQL 이해하기] - 8.1. SQL: SELECT I (0) | 2023.06.29 |
---|---|
[SQL 이해하기] - 7. 트랜잭션, NULL값 처리 (0) | 2023.05.31 |
[SQL 이해하기] - 5. 정규화 (0) | 2023.05.23 |
[SQL 이해하기] 4. 데이터의 이해 - 식별자(Identifiers) (0) | 2023.05.16 |
[SQL 이해하기] 3. 데이터의 이해 - 속성과 관계 (1) | 2023.05.10 |
댓글