2 반정규화(역정규화)

정규화된 엔티티, 속성, 관계를 시스템의 성능 향상, 개발과 운영을 단순화하기 위해 데이터 모델을 통합하는 프로세스를 말한다.

즉 데이터의 정합성과 데이터의 무결성을 우선으로 할지 데이터베이스 구성의 단순화와 성능을 우선으로 할지를 결정한다. 


2.1 반정규화(역정규화) 절차

1) 반정규화(역정규화) 대상 조사

→ 범위 처리 빈도수 조사 : 자주 사용되는 테이블에 접근하는 프로세스 수가 많고, 항상 일정한 범위만을 조회하는 경우

→  대량의 범위 처리 조사 : 대량이 데이터 범위를 자주 처리하는 경우

→ 통계성 프로세스 조사 : 별도의 통계 테이블 고려

→  테이블 조인 개수 : 지나치게 많은 조인이 걸려 데이터 조회 작업이 어려운 경우 

2) 다른 방법 유도 검토

→ 뷰 테이블 : 지나치게 많은 조인이 걸려 데이터 조회하는 작업이 어려운 경우

→클러스터링 또는 인덱스 적용 : 대량의 데이터는 PK의 성격에 따라 부분적인 테이블로 분리할 수 있다.(파티셔닝 기법)

→애플리케이션 : 로직을 변경함으로써 성능을 향상시킬 수 있다. 


3) 반정규화(역정규화) 적용

→ 테이블 반정규화(역정규화)

→ 속성의 반정규화(역정규화)

→ 관계의 반정규화(역정규화) 


2.2 테이블 반정규화(역정규화) 방법

1. 테이블 병합 2. 테이블 분할 3. 테이블추가
- 1:1:관계의 테이블 병합 
- 1:M 관계의 테이블 병합 
- 슈퍼타입 서브타입 테이블 병합
- 수직 분할 
- 수평 분할
- 중복 테이블 추가 
- 통계 테이블 추가 
- 이력 테이블 추가 
- 부분 테이블 추가



2.3 속성의 반정규화(역정규화)

1) 컬럼 중복 : 일반적으로 조인 프로세스를 줄이기 위해 컬럼 중복

 * 공급자라는 마스터 테이블과 변경되는 전화번호, 메일주소 내용이 이력형태로 관리되는 데이터 모델이다. 

이 모델에서 가장 최근에 변경된 값을 가져오려면 복잡한 조인이 발생된다.

SELECT a.공급자명, b.전화번호, c.메일주소 
  FROM 공급자명 a, 
       (SELECT x.공급자번호, x.전화번호 
          FROM 전화번호 x, 
               (SELECT   공급자번호, MAX (순번) 순번 
                    FROM 전화번호 
                   WHERE 공급자번호 BETWEEN '1001' AND '1005' 
                GROUP BY 공급자번호) y 
         WHERE x.공급자번호 = y.공급자번호 AND x.순번 = y.순번) b, 
       (SELECT x.공급자번호, x.메일주소 
          FROM 메일주소 x, 
               (SELECT   공급자 번호, MAX (순번) 순번 
                    FROM 메일주소 
                   WHERE 공급자번호 BETWEEN '1001' AND '1005' 
                GROUP BY 공급자번호) y 
         WHERE x.공급자번호 = y.공급자번호 AND x.순번 = y.순번) c 
 WHERE a.공급자번호 = b.공급자번호 
   AND a.공급자번호 = c.공급자번호 
   AND a.공급자번호 BETWEEN '1001' AND '1005'


정규화된 모델이 반정규화되지 않으면 복잡한 SQL문이 쉽게 발생된다. 

  

위와 같이 가장 최근에 변경된 값을 마스터에 위치(컬럼 중복) 반정규화하면 성능향상을 볼 수 있다.

SELECT 공급자명, 전화번호, 메일주소, 위치 
  FROM 공급자 
 WHERE 공급자번호 BETWEEN '1001' AND '1005'


2) 파생컬럼의 생성 : 판매 테이블의 판매금액이나 성적 테이블의 총점, 평균 등이 이에 해당

* 성적

학번 총점 평균 순위
20090101 890 4.0 9
20090101 950 4.3 3


* 공사진행

공사번호 공사일자 공사비 공사비누적
2001-001 2001-01-01 750,000 750,000
2001-001 2001-02-01 800,000 800,000


문제 : 성적 테이블의 순위? 한 학생의 총점이 변경되면 모든 레코드의 순위가 변경될 수 있다.

공사진행 테이블의 공사비누적? 공사이력이 변경 또는 추가될 때 현재 레코드와 그 이후 레코드의 공사비누적 값이 변경되어야 한다.

즉, 전후 레코드간 영향을 미칠 수 있는 속성은 가능하면 피하는 것이 좋다.