반정규화란 시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로, 의도적으로 정규화 원칙을 위배하는 행위이다.
정규화와 반정규화는 Trade off 관계에 있다.
정규화를 하면 정합성과 데이터무결성이 보장된다.
반면, 테이블이 복잡해지고 성능이 떨어질 수 있다.
그에 따라 입력(Create), 수정(Update), 삭제(Delete)의 성능은 향상되고 조회(Read)의 경우 나빠질수도 있고 좋아질 수도 있다.
반 정규화를 하면 테이블이 단순화되며 성능이 향상되는 반면,
정합성과 데이터무결성이 보장되지 않을 수있다.
반 정규화는 의도적으로 중복을 만들어 검색(Read) 성능을 향상시킨다.
하지만 속성이 각기 다른 테이블에 중복되어 나타나기 때문에 입력(Create), 수정(Update), 삭제(Delete)의 성능은 낮아진다.
애플리케이션 레벨에서 꼭 해당 속성에 포함된 모든 테이블에 트랜잭션을 보내야 한다.
본격적인 반 정규화 방식에 대해 이야기 하기 전에
디지털 디바이스(하드웨어)의 성능을 어떤식으로 보장해 주어야하는지 알아보자.
디스크와 메모리(M/M), CPU 큰 속도와 가격 차이를 가지고 있다.
CPU는 연산을 수행하며 가장 빠르고 비싸다.
디스크는 가장 큰 저장공간을 가지고 있고 느리다.
디스크와 CPU는 1만배 이상의 속도 차이를 가지고 있다.
이를 보완하기 위해 메모리가 중간에 자리잡고 있는데, 디스크가 장기기억장소라면 메모리는 단기기억장소이다. (메모리와 CPU의 속도차이도 커서 캐시라는 비싼 메모리를 그 간극을 보완한다.)
메모리는 한 트랜잭션에 필요한 데이터를 디스크에서 가져와 CPU 연산작업을 하는 기간동안 저장해놓는다. 디스크에서 메모리로 데이터를 퍼오는 횟수를 줄일수록 (속도)를 향상시킬 수 있다.
당연히 장기기억매체인 디스크에 저장되며, 디스크에서 메모리로 데이터를 퍼오는 횟수를 줄이려는 노력이 반정규화이다.
1:1관계의 테이블 병합
1:m관계의 테이블 병합
수퍼타입 서브타입 테이블 병합
수직 분할 (column 단위)
수평 분할 (recode 단위):
프로세스가 구간별(e.g 월별)로 발생하는 한 엔터티(테이블)를 구간별 엔터티로 분할한다.
구간별로 엔터티를 분할하면 데이터베이스(DB)의 성능은 향상되나 코드를 짤 때는 비효율적이다. 그래서 근래 DBMS에는 파티셔닝이라는 기능을 통해 테이블을 논리적으로는 1개인 테이블을 물리적으로는 N개로 쪼개서 저장할 수 있게 해준다.
중복 테이블, 집계 테이블, 이력 테이블, 부분 테이블 추가
중복 컬럼 추가
이미 테이블 C에서 테이블 A의 e컬럼을 조회할 수 있는 관계가 있으나, 자주 조회(Read)하는 컬럼 e를 테이블 C에도 추가하여 접근 경로를 단축시켜준다.
파생 컬럼 추가
Primary Key에 의한 컬럼 추가
오 입력 처리를 위한 컬럼 추가
관계중복
이미 A테이블에서 C테이블의 정보를 읽을 수 있는 관계가 있음에도 관계를 중복하여 조회(Read) 경로를 단축시킨다.