역정규화란 이러한 정규화된 테이블 구조를 일부 다시 합치거나, 중복 데이터를 허용하여 설계하는 작업이다.
즉, 역정규화는 성능이나 실용성을 위해 정규화 원칙을 의도적으로 완화하는 설계 기법이다.
역정규화가 필요한 상황과 고려할 사항
이렇게 실용성이나 성능을 위해 사용하는 역정규화가 필요한 상황은 언제 일까 ❔ 🤷♂️
1️⃣ 정규화로 인해 조인이 많아져 조회 성능이 저하된 경우
2️⃣ 조회 작업이 입력/갱신 작업보다 훨씬 많은 경우
3️⃣ 통계, 집계, 리포트용으로 쿼리가 빈번하게 실행되며 성능이 중요한 경우
위와 같은 상황에서 역정규화가 유용한 것은 알겠다. 그럼 역정규화를 사용할 때 고려할 점은?
1️⃣ 데이터 중복으로 인한 저장 공간이 증가된다는 점
2️⃣ 데이터 변경 시 무결성을 유지하기 위한 추가 로직 필요할 때
3️⃣ 쿼리 패턴을 충분히 분석한 뒤 제한적으로 적용해야 한다.
역정규화를 적용하면 안 되는 경우
아래와 같은 상황에서는 역정규화가 오히려 문제를 일으킬 수 있다.
데이터 변경이 빈번한 경우
결제, 정산과 같이 강한 데이터 정합성이 요구되는 도메인
하나의 데이터 변경이 여러 테이블에 영향을 미치는 구조
이 경우 역정규화는 트랜잭션 복잡도와 오류 가능성을 크게 증가시킨다.
역정규화의 대표적인 적용 방식
역정규화는 다양한 형태로 적용될 수 있다.
자주 조회되는 컬럼을 다른 테이블에 중복 저장
통계/집계 결과를 미리 계산하여 별도 테이블에 저장
읽기 성능 최적화를 위한 전용 테이블 또는 View 구성
역정규화의 장단점
우리가 알아본 역정규화의 장단점을 정리하면 아래와 같다.
장점
1️⃣ 조인 성능 향상
조인 없이 한 번에 데이터를 읽을 수 있어 쿼리 성능 향상
2️⃣ 쿼리 구조의 단순화
복잡한 조인 없이도 데이터를 쉽게 조회 가능
3️⃣ 통계, 집계와 같은 처리 최적화
미리 계산된 데이터를 저장해두면 실시간 집계를 할 필요가 없어진다.
단점
1️⃣ 데이터 중복 발생
여러 테이블에 동일한 데이터가 저장됨 -> 용량 증가 및 동기화 문제 우려
2️⃣ 데이터 무결성 저하 우려
데이터 변경 시 모든 관련 테이블을 동기화하지 않을 시 데이터 무결성을 해침
3️⃣ 코드/로직의 복잡도 증가
중복 데이터를 관리하기 위한 추가 비즈니스 로직이 필요할 수 있기에 복잡도 증가
4️⃣ DML 작업의 성능 저하 가능성
여러 곳에 데이터를 갱신해야 하기에 DML 쿼리의 복잡도가 증가할 우려가 있다.
역정규화 적용 전 고려해야 할 대안 ⚠
그렇기에 역정규화는 최후의 선택이어야 한다.
적용 전에 다음과 같은 방법을 먼저 검토하는 것이 바람직하다.
인덱스 최적화
쿼리 개선
캐시 도입
이러한 방법으로도 해결되지 않는 경우에만 역정규화를 고려해야 한다.
마무리 🔚
오늘은 역정규화에 대해 알아보았다.
역정규화는 성능 향상을 위한 강력한 도구이지만, 항상 정답은 아니다.
데이터 특성과 쿼리 패턴을 충분히 분석한 뒤, 필요한 부분에 한해 신중하게 적용하도록 해보자💯