주케터의 메모장

[SQLD] 비전공자의 SQLD 공부 : 반정규화(De-Normalization)에 대해 알아보자! 본문

TEST/SQLD

[SQLD] 비전공자의 SQLD 공부 : 반정규화(De-Normalization)에 대해 알아보자!

JOOKETER 2023. 8. 10. 12:05
320x100

안녕하세요

주케터입니다 :)

 

오늘은 SQLD공부를 이어서 해볼까해요

반정규화... 저에게는 너무 큰 산같이 느껴졌지만,

그 산을 함께 언덕으로 만들어보자구요!

 

 


반정규화란? 간단히 말하자면 성능향상을 위해 정규화를 포기하는 것 입니다.

하지만, 데이터의 무결성이 보장되지는 않고, 제한적으로 사용해야합니다.

 

더보기

무결성이란?

정밀성, 정확성, 완전성, 유효성의 의미로 사용되며, 데이터 베이스의 정확성을 보장하는 문제를 의미

 

반정규화는 데이터의 조회 성능을 향상 시키기 위해

데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정입니다.

단, 위에서 말한대로 입력, 수정, 삭제 성능을 저하될 수 있으며

데이터 정합성 이슈가 발생할 수 있습니다.

 

반정규화의 과정은 꼭 정규화가 끝난 후 거치게 되며, 정규화와 마찬가지로 일정한 룰이 존재합니다.

고로, 정규화와 반정규화는 동시에 일어날 수 없겠죠?

 

1) 테이블 반정규화

테이블 병합
> 업무 프로세스상 JOIN이 필요한 경우가 많아 테이블을
통합하는 것이 성능측면에서 유리할 경우 고려
1:1 관계 테이블 병합
1:M 관계 테이블 병합
슈퍼 서브 타입 테이블 병합
테이블 분할
> 수직분할: 엔터티의 일부 속성을 별도의 엔터티로 분할
> 수평분할: 엔터티의 인스턴스를 특정기준으로 별도의 엔터티로 분할
테이블 수직 분할(속성 분할) : 컬럼단위로 테이블을 1:1 분리
테이블 수평 분할(인스턴스 분할, 파티셔닝) : ROW단위로 테이블 분리
테이블 추가 중복 테이블 추가
> 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔터티 추가
통계 테이블 추가
> 통계값을 미리 계산해서 저장하는 테이블 추가
이력 테이블 추가
> 마스터 테이블에 존재하는 ROW를 트렌젝션 발생시점에 따라 복사해두는 테이블 추가
부분 테이블 추가
>자주 조회되는 컬럼들만 별도로 테이블 추가

 

2) 컬럼 반정규화

 

(1) 중복 컬럼 추가 : 업무 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서

유리할 경우 고려한다 . 이는 SELECT 비용은 감소하나, UPDATE 비용은 증가한다.

 

(2) 파생 컬럼 추가 : 프로세스 수행 시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식

상품의 재고나 프로모션 적용할인가 등이 이에 해당 할 수 있다.

계산을 통해 얻어지는 결과값을 테이블에 컬럼으로 저장

 

(3) 이력 테이블 컬럼 추가: 대량의 이력 테이블을 조회 할 때 , 속도가 느려질 것을 대비하여 조회 기준이 될 것으로

판단되는 컬럼을 미리 추가해놓는 방식. 최신 데이터 여부 등이 이에 해당할 수 있다.

 

3) 관계 반정규화(중복관계 추가)

업무 프로세스상 JOIN이 필요한 경우가 많아 중복관계를 추가하는 것이 성능 측면에서 유리할 경우

고려한다.

 


종류가 너무 많죠?

그래도 많이 빈출이 되고 어렵게 꼬는 문제가 있어서

꼭 꼭 꼭 숙지해야해요!

 

이걸 쉽게 풀이해주는 인강도 아래에 첨부해두겠습니다.

많은 도움이 되었으면 좋겠네요.

 

그럼 안녕!

728x90