반정규화는 참 어렵더라

기르기르·2022년 10월 13일
0

DB 기초

목록 보기
6/6
post-custom-banner

반정규화는 또 처음 들어보는데..😥

정규화에 대한 포스팅을 하던 중 반정규화라는 것도 있다는 사실을 알게되었다. 발견했을 때에는 정규화 글에 같이 포스팅하려고 했으나 생각보다 양이 있는 것 같아서 이렇게 따로 포스팅을 진행하게 되었다.

반정규화란?

정규화된 엔터티, 속성, 관계에 대해 시스템의 성능 향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법을 의미한다. 반 정규화는 의도적으로 중복을 만들거나 조인을 줄이는 등 의도적으로 정규화 원칙을 위배하는 방식이다.

반정규화 적용 상황과 주의 사항

반정규화를 적용 하기에 적합한 조건은 다음과 같다.

① 테이블에 지나치게 많은 조인(JOIN)이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우
② 통계성 프로세스에 의해 통계 정보를 필요로 할 때 (반정규화가 적용된 별도의 통계테이블 생성)
③ 자주 사용되는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
④ 대량의 데이터 범위를 자주 처리하는 경우에 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없을 경우

반정규화를 대체할 수 있는 방안

가급적이면 데이터를 중복하여 데이터 무결성을 깨뜨릴 위험을 제어하기 위해 다른 방안을 모색해보아야 한다.
아래에서는 그 방안에 대한 예시이다.

1. 뷰(view) 사용
뷰가 조회의 성능을 향상시키는 역할을 수행하지는 않지만, 개발자별로 SQL문장을 만드는 방법에 따라 성능저하가 나타날 수 있으므로 성능을 고려한 뷰를 생성한다.

2. 인덱스 조정
인덱스를 통해 성능을 충분히 확보할 수 있다면 굳이 반정규화를 할 필요가 없다.

3. 클러스터링 적용
대량의 데이터를 특정 클러스터링 팩트에 의해 저장방식을 다르게 하는 방법이다. 이 방법은 데이터에 DML을 실행할 경우 성능이 저하되는 문제가 있기 때문에 조회중심의 테이블 외에는 적용하면 안되는 오브젝트이다. 하지만 조회 업무가 대부분이고 인덱스를 통한 성능향상이 불가능하다면 클러스터링 적용을 고려할만하다.

4. 응용 애플리케이션에서 로직 구사
응용 메모리 영역에 데이터를 처리하기 위한 값을 캐쉬하거나 중간 클래스 영역에 데이터를 캐쉬해 공유하게 하여 성능을 향상 시키는 것이다.

5. 파티셔닝 기법(Partitioning)
대량의 데이터는 Primary Key의 성격에 따라 부분적인 테이블로 분리할 수 있다. 인위적으로 테이블을 통합/분리 하지 않고 물리적인 저장기법에 따라 성능을 향상시킬 수 있도록 한다. 특정 기준(파티셔닝 키)에 따라 저장공간이 분리되고 트랜잭션이 수행될 때 그 기준에 따라 수행하면 조회할 때 성능의 향상을 기대할 수 있다.

주의사항(단점)💥

정규화와 반정규화 사이에는 Trade-Off 관계가 존재한다. 양 쪽에 추가 달린 저울처럼 정규화만을 강조하다 보면 성능의 이슈가 발생될 수 있고 반정규화를 과도하게 적용하다 보면 데이터 무결성이 깨질 수 있는 위험이 증가한다.
그러므로 반정규화 진행 전에 데이터 무결성이 충분히 유지될 수 있도록 프로세스 처리에 있어서 안정성이 먼저 확인이 되어야 한다.

반정규화의 종류


  • 테이블의 반정규화
    (1) 테이블 병합
    데이터 처리 시 두 개 이상의 동일한 테이블을 반복하여 사용하는 경우에 활용한다.
    ex) 1:1 관계 테이블 통합, 1:N 관계 테이블 통합, 슈퍼타입/서브타입 테이블 통합
    (2) 테이블 분할
    데이터 처리 시 한 테이블 안에서 특정 컬럼만 자주 쓰이는 경우나 어떤 상황에는 A 컬럼들, 다른 상황에는 B 컬럼들 처럼 쓰임이 서로 다른 경우에 활용한다.
    ex) 수평 분할, 수직 분할
    (3) 테이블 추가
    여러 테이블에서 데이터를 추출해서 사용해야 하거나 다른 서버에 저장된 테이블을 이용해야 하는 경우에 활용한다.
    ex) 중복 테이블 추가, 통계 테이블 추가 등

  • 컬럼의 반정규화
    (1) 중복 컬럼 추가
    자주 사용되는 컬럼이 다른 테이블에 분산되어 있어서 상세한 조건을 주어도 액세스 범위를 줄이지 못하는 경우 혹은 기본키의 형태가 적절하지 않거나 너무 많은 컬럼으로 구성된 경우에 활용한다. 주로 조인을 감소시키기 위해서 중복된 컬럼을 생성한다.
    (2) 파생 컬럼 추가
    물품 발주 다이어 그램에서 총 주문 금액, 고객 등급 반영을 위한 고객 총 주문 금액 등 타 테이블의 속성 값을 이용해서 파생된 값을 저장해야하는 컬럼의 경우에 활용한다. 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능 저하를 예방하기 위해 미리 값을 계산하여 컬럼에 보관하는 방식이다.
    (3) 이력 테이블 컬럼 추가
    이력 테이블은 대용량인 경우가 있어서 처리 속도가 느리기때문에 최근 값이나 불특정한 날의 값을 구할 때 활용한다. 기능성 컬럼(최근 값 여부, 시작/종료 일자 등)을 추가한다.
    (4) PK에 의한 컬럼 추가
    복합의미를 갖는 PK를 단일속성으로 구성하면 성능저하가 일어날 수 있어 활용한다. PK에 데이터가 있지만 일반 속성으로 포함하는 방식이다.
    (5) 응용 시스템 오작동을 위한 컬럼 추가
    사용자가 데이터 처리를 잘못 하였을 경우 이전의 데이터를 복구하고 싶을 때 이전 데이터를 중복해서 컬럼에 보관하는 방식으로 오작동 처리를 위한 임시적인 기법이다. 하지만 이력 데이터 모델로 풀어낼 시에는 정상적인 데이터 모델의 기법으로 활용할 수 있다.

  • 관계 반정규화
    (1) 중복 관계 추가
    여러 경로를 통해 조인하여 데이터를 처리하면 성능저하가 발생할 수 있다. 이를 예방하기 위해서 추가적으로 관계를 맺는 방법이다.

참고 blog

https://dataonair.or.kr/db-tech-reference/d-guide/sql/?mod=document&uid=333 (반정규화 전반 내용)
https://koreascience.kr/article/CFKO201208455513432.pdf (반정규화 전반 내용)

post-custom-banner

0개의 댓글