* 반정규화 절차
1. 반정규화 대상을 조사
- 자주 사용되는 테이블에 접근(Access)하는 프로세스의 수가 많고, 항상 일정한 범위만을 조회하는 경우 반정규화를 검토
- 테이블에 대량의 데이터가 있고 대량의 데이터 범위를 자주 처리하는 경우 처리 범위를 일정하게 줄이지 않아 성능을 보장할 수 없을때 반정규화를 검토
- 통계성 프로세스에 통계 정보가 필요할 때 별도의 통계 테이블(반정규화 테이블)을 생성
- 테이블에 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우 반정규화를 검토
2. 반정규화 대상을 다른 방법으로 처리할 수 있을 지 검토
- 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우 뷰를 사용하면 해결할 수도 있음
- 대량의 데이터 처리나 부분 처리 때문에 성능이 저하되는 경우 클러스터링 적용하거나 인덱스를 조정함으로써 성능을 향상 시킬 수 있음
- 대량의 데이터는 PK의 성격에 따라 부분적인 테이블로 분리할 수 있음. 즉 파티셔닝 기법이 적용되어 성능 저하를 방지할 수 있음
- 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상시킬 수 있음.
3. 반정규화를 적용
- 테이블, 속성, 관계를 반정규화의 대상으로 삼을 수 있으며, 꼭 테이블과 속성 관계를 중복으로 가져가는 방법만이 반정규화가 아니라 테이블, 속성, 관계를 추가할 수도 있고, 분할할 수 도 있으며 제거할 수도 있음.
* 반정규화 방법
- 반정규화는 테이블, PK, 컬럼, 관계에 대해 모두 적용할 수 있으며, 테이블에 의한 반정규화를 할 경우 컬럼과 관계가 모두 적용될 수 있음.
1. 테이블 반정규화 방법
- 테이블에 의한 반정규화 방법으로는 테이블을 병합하는 방법, 테이블을 분할하는 방법 그리고 테이블을 추가하는 방법이 있음
1) 테이블 병합
- 먼저 두개의 테이블에 발생하는 프로세스가 동일하게 처리되는 경우가 많을 경우 병합을 고려할 수 있음. 즉 항상 SQL 문장이 두개의 테이블을 조인하여 작성되면 두 테이블은 병합 대상이 됨
- 두 테이블을 같이 조회하는 경우가 많고, 두 테이블간의 관계가 1:1로 지정되어 있으면서 한쪽에 필수 관계인 경우 PK가 동일하므로 테이블을 병합할 수 있음
- 두 테이블 관계가 1:M이라 할지라도 항상 두 개의 테이블을 조인하여 조회하는 경우에는 데이터의 중복이 발생하더라도 병합 대상이 됨
- 슈퍼타입과 서브타입의 관계로 연결되어 있을 경우 테이블을 병합할 수 있음
2) 테이블 분할
엔티티타입이 하나의 테이블로 구축될 경우 테이블을 이용하는 방법에 따라 성능이 저하될 수도 있으므로 테이블을 분리할 수도 있음.
또한, 데이터베이스를 운영하는 전략적인 측면에서 테이블을 분할하는 경우도 있음.
2-1) 테이블을 분할하는 세 가지 경우
- 테이블에 속한 모든 속성에 대한 특정 속성들만 집중적으로 사용하는 경우
- 모든 속성을 이용하더라도 PK에 따라 특별한 범위만 집중적으로 사용하는 경우가 있음. 이와 같이 부분적인 속성들만 이용하거나 테이블 내 특정 범위의 레코드만 이용
- 지역별 데이터 분산 전략이나 데이터 서버별 분산 전략에 의해 테이블을 분할하는 경우임.
2-2) 테이블을 분할하면 다음과 같은 특징이 있음
- 테이블 전체적인 스캔(Scan) 범위가 축소되므로 한 테이블에서 접근하는 양이 감소
- 테이블이 분할되어 있으므로 테이블에 걸린 잠금(Locking) 현상 및 정합(Contention)이 감소
- 분할된 테이블을 같이 조회해야 할 경우 SQL 문장이 복잡해짐 ( Union All, Union 등을 사용해야 함 )
- 단일 테이블을 처리하는 속도는 향상되지만 분할된 테이블을 모두 조회할 경우에는 처리 속도가 느려질 수 있음
2-2-1) 테이블의 수직적 분할
- 테이블에 속한 모든 속성을 사용하지 않고 특정 속성들만 집중적으로 사용한다면 테이블 분할의 이유가 됨.
2-2-2) 테이블의 수평적 분할
- 보통 기업이나 관공서는 본사와 지사가 떨어져있는 경우가 많음. 이와 같이 동일한 기능을 하는 기관이 여려 지역에 떨어져 있으면 각 지사별로 데이터베이스 구조는 비슷하지만, 이용하는 데이터는 서로 다른 로우를 이용하는 경우가 있음.
이와 같이 데이터베이스의 스키마는 동일하지만, 그 안에 들어있는 데이터값을 이용하는 방법이 로우별로 구분지어 이용되는 경우 테이블을 로우 단위로 나누는 수평 분할을 하게 됨.
또는 하나의 테이블 내에 아주 많은 정보가 있지만, 항상 특정 구간만 선별하여 조회하는 경우가 많을 때 테이블을 로우 단위로 쪼개어 구성하는 수평 분할을 이용.
반정규화 두번째 시간에서 계속하겠습니다...
읽어주셔서 감사합니다.
데이터베이스 모델링(무결성, 트랜잭션) (0) | 2020.05.19 |
---|---|
데이터베이스모델링(반정규화 절차 2) (0) | 2020.05.10 |
데이터베이스모델링(6) (0) | 2020.03.06 |
데이터베이스 모델링(3) (0) | 2020.03.01 |
데이터베이스 모델링 (2) (0) | 2020.02.29 |
댓글 영역