정규화에 대한 포스팅을 하던 중 반정규화라는 것도 있다는 사실을 알게되었다. 발견했을 때에는 정규화 글에 같이 포스팅하려고 했으나 생각보다 양이 있는 것 같아서 이렇게 따로 포스팅을 진행하게 되었다.
정규화된 엔터티, 속성, 관계에 대해 시스템의 성능 향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법을 의미한다. 반 정규화는 의도적으로 중복을 만들거나 조인을 줄이는 등 의도적으로 정규화 원칙을 위배하는 방식이다.
반정규화를 적용 하기에 적합한 조건은 다음과 같다.
① 테이블에 지나치게 많은 조인(JOIN)이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우
② 통계성 프로세스에 의해 통계 정보를 필요로 할 때 (반정규화가 적용된 별도의 통계테이블 생성)
③ 자주 사용되는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
④ 대량의 데이터 범위를 자주 처리하는 경우에 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없을 경우
가급적이면 데이터를 중복하여 데이터 무결성을 깨뜨릴 위험을 제어하기 위해 다른 방안을 모색해보아야 한다.
아래에서는 그 방안에 대한 예시이다.
1. 뷰(view) 사용
뷰가 조회의 성능을 향상시키는 역할을 수행하지는 않지만, 개발자별로 SQL문장을 만드는 방법에 따라 성능저하가 나타날 수 있으므로 성능을 고려한 뷰를 생성한다.
2. 인덱스 조정
인덱스를 통해 성능을 충분히 확보할 수 있다면 굳이 반정규화를 할 필요가 없다.
3. 클러스터링 적용
대량의 데이터를 특정 클러스터링 팩트에 의해 저장방식을 다르게 하는 방법이다. 이 방법은 데이터에 DML을 실행할 경우 성능이 저하되는 문제가 있기 때문에 조회중심의 테이블 외에는 적용하면 안되는 오브젝트이다. 하지만 조회 업무가 대부분이고 인덱스를 통한 성능향상이 불가능하다면 클러스터링 적용을 고려할만하다.
4. 응용 애플리케이션에서 로직 구사
응용 메모리 영역에 데이터를 처리하기 위한 값을 캐쉬하거나 중간 클래스 영역에 데이터를 캐쉬해 공유하게 하여 성능을 향상 시키는 것이다.
5. 파티셔닝 기법(Partitioning)
대량의 데이터는 Primary Key의 성격에 따라 부분적인 테이블로 분리할 수 있다. 인위적으로 테이블을 통합/분리 하지 않고 물리적인 저장기법에 따라 성능을 향상시킬 수 있도록 한다. 특정 기준(파티셔닝 키)에 따라 저장공간이 분리되고 트랜잭션이 수행될 때 그 기준에 따라 수행하면 조회할 때 성능의 향상을 기대할 수 있다.
정규화와 반정규화 사이에는 Trade-Off 관계가 존재
한다. 양 쪽에 추가 달린 저울처럼 정규화만을 강조하다 보면 성능의 이슈가 발생될 수 있고 반정규화를 과도하게 적용하다 보면 데이터 무결성이 깨질 수 있는 위험이 증가한다.
그러므로 반정규화 진행 전에 데이터 무결성이 충분히 유지될 수 있도록 프로세스 처리에 있어서 안정성이 먼저 확인이 되어야 한다.
https://dataonair.or.kr/db-tech-reference/d-guide/sql/?mod=document&uid=333 (반정규화 전반 내용)
https://koreascience.kr/article/CFKO201208455513432.pdf (반정규화 전반 내용)