반정규화

반정규화의 개요

반정규화의 정의

정규화로 무결성, 일관성 등은 향상되지만 실제 업무 수행 시 과도한 Join으로 인한 성능 저하 부작용이 발생할 수 있어 이를 해소하기 위해 사용하는 방법

반정규화의 목적

  1. 성능 개선
  2. 데이터 관리의 편의성

반정규화의 유형

유형 설명
테이블 추가 * 집계 테이블 추가
예) 사업부 별 인원 현황을 조사하기 위해 미리 사업부 별 인원을 집계하여 생성
테이블 수직분할 * 매우 많은 수의 컬럼으로 구성된 테이블에서 빈번하게 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을 생성하려면 계약 테이블은 상품군 코드를 가지고 있어야 함
파생 컬럼 추가 * 기본 테이블의 컬럼 이외에 연산이나 조작이 필요한 컬럼을 추가
예) 세대(세대번호, 세대주번호, 세대원수), 세대원(세대번호, 세대원번호, 세대원 이름)의 테이블과 같이 세대 정보 조회 시 세대원 수를 표시하고 싶은 경우 동일 세대번호에 대한 세대원 수를 미리 계산하여 세대 테이블에 세대원 수라는 컬럼으로 추가할 수 있음

반정규화 수행 시 고려사항

  1. 반정규화 이전에 인덱스 조정, 부분범위 처리 유도, 클러스터링 등 성능 향상이 가능한지 검토
  2. 반정규화 이후에 중복된 데이터의 정합성 확보를 위해 별도의 처리 로직을 구현해 일관성 및 무결성 유지