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


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

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

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

번호 제목 글쓴이 날짜 조회 수
공지 [기술 보고서 다운로드] IDC Technology Spotlight: 모델 기반 데이터 설계를 통한 비즈니스 민첩성 확보 방안 관리자 2015.08.24 8234
공지 ER/Studio Team Server(ER/Studio 용 웹포탈) 설치 및 사용자 가이드 손보라 2014.07.15 39441
공지 Repository 설치 및 사용 가이드 손보라 2014.05.27 50163
공지 ER/Studio Data Architect 설치 및 사용자가이드 관리자2 2012.01.27 52572
21 [기술백서] DB툴 선택시 고려사항 top10 관리자 2014.11.12 1632
20 [기술백서] 하루에 1시간을 벌 수 있는 10가지 방법 관리자 2014.11.12 1820
19 ERwin으로 작성된 모델을 ER/Studio로 마이그래이션하기 file 손보라 2015.01.12 2523
18 ER/Studio vs ERwin, 그 차이점을 발견해보세요! file 손보라 2015.02.06 5002
17 20150305 [온라인세미나] 스마트한 데이터모델링 with ER/Studio 발표자료 관리자 2015.03.09 4196
16 Embarcadero의 웹포탈인 TeamServer를 경험해보세요! 손보라 2015.03.17 4439
15 ER/Studio DA와 Team Server 연동하기 손보라 2015.03.17 4143
14 ER/Studio! MongoDB 지원 손보라 2015.03.19 4787
13 ER/Studio의 웹포탈인 TeamServer Core 사용해보기(호스팅/트라이얼) file 손보라 2015.04.08 4433
12 [매크로활용] [MySQL] 컬럼의 Definition을 DB Comment에 추가하기 file 손보라 2015.08.06 5431
11 [매크로활용] 매크로 사용방법 file 손보라 2015.08.11 4147
10 리버스 엔지니어링 후 엔터티/속성 논리명의 영문을 한글 변환 작업 [1] file 손보라 2015.08.12 4294
9 ER/Studio DA 네이밍 표준 템플릿(NST) 파일 생성 방법 file 손보라 2015.08.12 4515
8 자동 네이밍 스탠다드 기능으로 논리명<->물리명 자동 변환 file 손보라 2015.08.13 4445
7 MSSQL Server에 리파지토리 설치 시 "##tmp[테이블명] table could not initialize bulk insert" 문제 관리자 2015.09.04 5079
6 [발표자료] 20151203 엔터프라이즈 환경의 데이터모델 관리방안 관리자 2015.12.04 3941
5 ER/Studio 2016 출시 - 더욱 강력해진 엔터프라이즈 급 데이터모델링 도구 ER/Studio 2016 발표 손보라 2016.02.02 4776
4 ER/Studio 2016 출시 세미나 - 비즈니스 중심의 데이터 아키텍처 구축 손보라 2016.02.02 5096
3 [발표자료] 20160908 효과적인 데이터모델링을 위한 14가지 방법 [2] 관리자 2016.09.08 5319