반정규화의 개요
반정규화의 정의
정규화로 무결성, 일관성 등은 향상되지만 실제 업무 수행 시 과도한 Join으로 인한 성능 저하 부작용이 발생할 수 있어 이를 해소하기 위해 사용하는 방법
반정규화의 목적
- 성능 개선
- 데이터 관리의 편의성
반정규화의 유형
| 유형 | 설명 |
|---|---|
| 테이블 추가 | * 집계 테이블 추가 예) 사업부 별 인원 현황을 조사하기 위해 미리 사업부 별 인원을 집계하여 생성 |
| 테이블 수직분할 | 매우 많은 수의 컬럼으로 구성된 테이블에서 빈번하게 Access 되는 컬럼과 Access 횟수가 적은 컬럼을 분리하여 구성 분리된 테이블은 1:1 관계 유지 * Disk I/O 및 네트워크 트래픽을 줄일 수 있음 예) 사원정보 테이블에서 사번, 부서, 이름, 직급, 전화번호는 자주 사용하고 주소, 종교, 본적은 자주 사용하지 않는 경우 분할 |
| 테이블 수평분할 | 하나의 테이블을 PK를 중심으로 2개 이상의 파티션으로 분리 분리된 여러 파티션에 데이터를 동시에 Load 하는 등 병렬처리로 인한 수행시간 단축 어플리케이션에서 DB 접근 시 파티션 단위로 Locking 되어 경합 감소 가능 파티션 별로 별도의 물리적 디스크를 사용하면 I/O 부하 감소 가능 |
| 테이블 통합 | * 1:1 관계인 테이블 들에 빈번한 Join이 발생하는 경우 이를 최소화하기 위해 통합 |
| Parent-Child 테이블 통합 | Child 테이블의 Row 수가 Parent 테이블의 레코드 별로 고정되어 있는 경우 Parent 테이블의 컬럼으로 통합 Parent 레코드 조회 시 Child 레코드를 읽지 않아도 되므로 DB Access 성능이 어플리케이션 코딩 시 늘어나는 노력보다 중요한 경우 적용 가능 예) 계약(계약번호, 계약자번호), 담보(계약번호, 담보코드, 담보금액)로 이루어진 Parent, Child 구조에서 담보코드가 대인/대물/자차/자손 네 가지로 고정되면 계약(계약번호, 계약자번호, 대인담보금액, 대물담보금액, 자차담보금액, 자손담보금액)과 같이 Child의 4개 Row의 담보금액을 Parent 컬럼으로 통합 가능 |
| 중복 칼럼 추가 | 빈번한 Join 발생으로 성능 저하가 우려되는 경우나 특정 컬럼이 파티션 키로 사용되는 경우 해당 컬럼을 중복으로 추가 Join을 피하여 DB Access 횟수는 줄지만 Update 비용은 증가 갱신보다 조회가 매우 많거나, 갱신보다 조회 성능 향상이 중요한 경우 적용 예) 계약(계약번호, 상품코드), 상품(상품코드, 상품군 코드)으로 구성된 테이블에서 계약 정보 조회 시 상품군 코드를 항상 같이 조회한다면 계약 테이블에 상품군 코드를 중복 컬럼으로 추가 또는 상품군 코드를 항상 같이 조회하지는 않지만 대용량 계약 테이블을 상품군을 기준으로 Partition을 생성하려면 계약 테이블은 상품군 코드를 가지고 있어야 함 |
| 파생 컬럼 추가 | * 기본 테이블의 컬럼 이외에 연산이나 조작이 필요한 컬럼을 추가 예) 세대(세대번호, 세대주번호, 세대원수), 세대원(세대번호, 세대원번호, 세대원 이름)의 테이블과 같이 세대 정보 조회 시 세대원 수를 표시하고 싶은 경우 동일 세대번호에 대한 세대원 수를 미리 계산하여 세대 테이블에 세대원 수라는 컬럼으로 추가할 수 있음 |
반정규화 수행 시 고려사항
- 반정규화 이전에 인덱스 조정, 부분범위 처리 유도, 클러스터링 등 성능 향상이 가능한지 검토
- 반정규화 이후에 중복된 데이터의 정합성 확보를 위해 별도의 처리 로직을 구현해 일관성 및 무결성 유지