오늘은 SQLD 과목 > 데이터 모델링의 이해 > 반정규화에 대해 알아보겠습니다.
반정규화의 개념
- 정규화된 엔티티, 속성, 관계에 대해 시스템의 성능 향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법
- 데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하되거나
- 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되거나
- 컬럼을 계산하여 읽을 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행합니다.
=> 과도한 정규화로 인해 오히려 성능이 저하된 경우 사용하는 기법
반정규화의 기법 - 테이블/컬럼/관계반정규화
1. 테이블 반정규화
테이블 병합 | 테이블 분할 | 테이블 추가 |
1:1 | 수직 분할 | 중복 테이블 추가 |
1:M | 수평 분할 | 통계 테이블 추가 |
슈퍼, 서브 타입 병합 | 이력 테이블 추가 |
1-1. 중복 테이블 병합
데이터 사용 시, 두 세개의 테이블을 항상 같이 쓰게 되는 경우 해당 테이블들을 병합하는 방법입니다.
1-2. 테이블 분할
한 테이블에서 자주 쓰이는 컬럼과 아닌 컬럼으로 나뉘는 경우
A 연산에서는 a컬럼들, B 연산에서는 b컬럼들만 사용되는데 a,b 컬럼이 한 테이블에 들어있을 때,
분할하여 여러 테이블로 쪼개는 방법입니다.
1-3. 테이블 추가
자주 쓰이는 부분이 모두 한 테이블에 들어있을 때, 내용이 중복되더라도 테이블을 하나 추가하는 방법입니다.
2. 컬럼 반정규화
- 중복 컬럼 추가
(특정 컬럼이 모든 테이블의 외래키로 참조되면서 그 테이블들의 기본키가 되는 경우,
외래키를 해당 테이블의 기본키로 중복해서 생성하는 방법입니다. > 조인감소효과)
- 파생 컬럼 추가 (미리 값을 계산하여 컬럼에 보관합니다.)
- 이력 테이블 컬럼 추가
(대량의 이력 데이터 처리시 최근값, 시작, 종료 일자를 추가해 속도를 빠르게 합니다.)
- pk에 의한 컬럼 추가
(단일 pk안에서 특정값을 별도로 조회하는 경우 성능 저하가 발생합니다.)
(이미 pk안에 데이터가 존재하지만 성능향상을 위해 일반속성으로 생성하는 방법입니다.)
- 응용 시스템의 오작동을 위한 컬럼 추가
(업무적으로 의미는 없지만, 이전 데이터를 임시적으로 중복하여 보관하는 경우)
3. 관계 반정규화
- 중복 관계 추가
(여러 경로를 거쳐 조인이 가능하지만,
이 때 발생할 수 있는 성능 저하를 예방하기 위해 추가적인 관계를 맺는 방법입니다.)
- 데이터 무결성을 깨트릴 위험을 가지지 않고서도 데이터처리의 성능을 향상시킬 수 있는 반정규화의 기법입니다.
※ 데이터 무결성:
데이터가 전송, 저장되고 처리되는 모든 과정에서 변경되거나 손상되지 않고 완전성, 정확성, 일관성을 유지함을 보장하는 특성입니다.