😺 반정규화란?
정규화는 데이터 중복을 최소화하고, 일관성을 유지하는 데 중점을두고
반정규화는 성능을 향상시키기위해 중복을 허용하거나 테이블을 합치는 방법이다.
😺 반정규화의 필요성
- 조회 성능 향상
정규화된 테이블은 여러 번의 조인을 필요로 하기 때문에 성능에 문제가 생길 수 있으나 반정규화는 조회 성능을 개선시킬 수 있다.
- 복잡한 쿼리 최적화
데이터를 여러 번 조인할 필요 없이, 이미 저장된 중복 데이터를 통해 빠르게 조회할 수 있습니다.
- 읽기 성능 중요 데이터가 많이 읽히고, 업데이트가 적거나 없는 경우에는 반정규화가 성능을 크게 향상
하지만 중복 데이터가 존재하게 되므로, 데이터의 일관성을 유지하기 어려운 단점이 있다.
😺 반정규화 예시
- 단일 테이블에 중복 데이터 추가
- 자주 조회되는 데이터라면 고객정보와 주문정보를 하나의 테이블로 합칠 수 있다. 그럼 조회할 때 조인없이 바로 정보를 얻을 수 있다.

위와 같은 테이블구조라면 고객정보,주문정보를 조회하려면 조인이 필요하다.
EX) SELECT c.CustomerName, o.OrderDate
FROM Customer c
JOIN Order o ON c.CustomerID = o.CustomerID;
테이블을 하나로 합쳐서 반정규화를 진행한다면?
조인없이 하나의 테이블에서 결과를 추출할 수 있다.

SELECT CustomerName, OrderDate
FROM CustomerOrder;
반정규화 기법에는 어떤것들이 있을까?
😺 반정규화 기법
- 테이블 반정규화
- 테이블 병합 : 관계 병합, 슈퍼/서브타입 병합 (one to one, plus, single type)
- 테이블 분할 : 수직, 수평 분할
- 테이블 추가 : 중복 테이블 / 통계 테이블 / 이력 테이블 / 부분 테이블 추가
- 칼럼 반정규화
- 중복 컬럼 추가 : 조인 횟수를 감소시키기 위해 다른 테이블의 칼럼 중복 칼럼 저장
- 파생 컬럼 추가 : 값의 계산으로 인해 성능 저하 예방,예상값을 미리 계산해서 중복 컬럼 저장
- 이력테이블 컬럼 추가 : 기능성 컬럼, 대량 이력 데이터 처리의 성능향상을 위해 종료 여부,최근값 여부 등의 컬럼 추가로 저장
- PK에 의한 컬럼 추가 : PK가 복합키 일경우 복합키 대신, 하나의 컬럼으로 합친새로운 컬럼 생성
- 데이터 복구를 위한 컬럼 추가 : 사용자의 실수 OR 응용프로그램 오류로 인해 데이터가 잘못 처리된 경우 원래값으로 복구하기위해 이전 데이터로 임시로 중복 저장
- 관계 반정규화
- 중복관계 추가 : 관계의 반정규화는 데이터 무결성을 보장할 수 있고, 데이터 처리 성능을 향상