ER/Studio 데이터모델링이란 - 9.반정규화(역정규화)
2012.01.04 02:16
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 |
문제 : 성적 테이블의 순위? 한 학생의 총점이 변경되면 모든 레코드의 순위가 변경될 수 있다.
공사진행 테이블의 공사비누적? 공사이력이 변경 또는 추가될 때 현재 레코드와 그 이후 레코드의 공사비누적 값이 변경되어야 한다.
즉, 전후 레코드간 영향을 미칠 수 있는 속성은 가능하면 피하는 것이 좋다.
