[SQLD] 반정규화(De-Normalization) | PART 1
데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정이다.
주의해야 할 점은 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 가능성이 높고 데이터 정합성 문제가 발생할 수 있다.
반정규화는 정규화가 끝난 후 거치게 되며 정규화와 마찬가지로 특정 방식이 존재한다.
Sep 12, 2024
데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정이다.
주의해야 할 점은 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 가능성이 높고 데이터 정합성 문제가 발생할 수 있다.
반정규화는 정규화가 끝난 후 거치게 되며 정규화와 마찬가지로 특정 방식이 존재한다.
✅ 1. 테이블 반정규화☑️ 1) 테이블 병합☑️ 2) 테이블 분할(1) 테이블 수직 분할(2) 테이블 수평 분할☑️ 3) 테이블 추가(1) 중복 테이블 추가(2) 통계 테이블 추가(3) 이력 테이블 추가(4) 부분 테이블 추가✅ 2. 컬럼 반정규화☑️ 1) 중복 컬럼 추가☑️ 2) 파생 컬럼 추가☑️ 3) 이력 테이블 컬럼 추가✅ 3. 관계 반정규화
✅ 1. 테이블 반정규화
테이블 병합 | - 1:1 관계 테이블 병합
- 1:N 관계 테이블 병합
- 슈퍼 서브 타입 테이블 병합 |
테이블 분할 | - 테이블 수직 분할(속성 분할)
- 테이블 수평 분할(인스턴스 분할, 파티셔닝) |
테이블 추가 | - 중복 테이블 추가
- 통계 테이블 추가
- 이력 테이블 추가
- 부분 테이블 추가 |
☑️ 1) 테이블 병합
업무 프로세스상 JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려한다.
1:N 관계 테이블 병합의 경우 1인 테이블 쪽에 해당하는 엔터티의 속성 개수가 많으면 병합했을 경우 중복 데이터가 많아지므로 테이블 병합에 적절하지 못하다.
☑️ 2) 테이블 분할
(1) 테이블 수직 분할
엔터티의 일부 속성을 별도의 엔터티로 분할(1:1 관계가 성립)한다.
- 테이블을 수직 분할하면 한 개의 블록에 더 많은 인스턴스를 저장할 수 있게 된다.
- 속성의 사용 빈도나 속성값의 NULL 여부를 기준으로 분할할 수 있다.
(2) 테이블 수평 분할
엔터티의 인스턴스를 특정 기준으로 별도의 엔터티로 분할(파티셔닝)한다.
- 데이터베이스의 파티셔닝 기법을 주로 이용한다.
- 테이블 수평 분할을 하는 경우 관계가 없는 다수의 테이블이 생성된다.
☑️ 3) 테이블 추가
(1) 중복 테이블 추가
데이터 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔터티를 추가한다.
(2) 통계 테이블 추가
기존 데이터를 이용하여 통계치를 미리 계산하여 저장해놓는다.
(3) 이력 테이블 추가
이력 관련 테이블에서 과거의 이력에 대한 데이터를 관리한다.
(4) 부분 테이블 추가
특정 속성의 데이터가 자주 필요한 경우, 해당 속성만 따로 분리하여 부분 테이블로 생성한다.
✅ 2. 컬럼 반정규화
☑️ 1) 중복 컬럼 추가
업무 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려한다.
☑️ 2) 파생 컬럼 추가
프로세스 수행 시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식으로 상품의 재고나 프로모션 적용 할인가 등이 이에 해당할 수 있다.
☑️ 3) 이력 테이블 컬럼 추가
대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식이다. 최신 데이터 여부 등이 이에 해당한다.
✅ 3. 관계 반정규화
업무 프로세스 상 JOIN이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 고려한다.
여러 경로를 거쳐 조인 할 수 있지만, 성능 저하를 예방하기 위해 추가적인 관계를 맺는 것이다!
Share article