데이터베이스 반정규화
IT위키
더 많은 작업
- Denormalization
- 데이터베이스 성능 향상 등을 위해 정규화된 데이터를 의도적으로 정규형을 위배한 데이터 구조로 만드는 행위
- 테이블 합병: 논리적으로 구분된 엔티티들을 하나의 테이블로 합친다.
- 논리적 모델 상으론 구분되어야 하지만, Join 없이 하나의 테이블로 관리하는 것이 성능 측면에서 유리할 수 있다.
- 중복 칼럼 추가: 게시판 테이블에 회원 정보를 일부 저장한다.
- 회원 정보 테이블과 Join 하여 불러올 수 있지만, 일부 중복 데이터만으로 Join 없이 처리한다면 더 유리할 수 있다.
- 계산된 칼럼 추가: 평균치, 계량값을 특정 필드에 추가한다.
- 바로바로 계산할 수 있는 값이지만, 자주 참조되는 값이라면 DB에 저장해두는 것이 유리할 수 있다.
- 코드 명칭 칼럼 추가: 남자 여자를 F, M이 아니라 그냥 남자, 여자로 저장한다.
- 출력 시 '남자' '여자'로 보여줘야 하는 경우 연산을 줄일 수 있다.
하나의 테이블을 성능을 위해 여러 테이블로 쪼개는 것도 반정규화에 속한다. 정규화처럼 이상 현상을 없애려는 것이 아니라 접근 성능을 높이려는 것이기 때문이다.
| 기법 | 나누는 방향 | 쓰는 경우 |
|---|---|---|
| 수직 분할(컬럼 분할) | 컬럼을 나누어 일부 컬럼을 별도 테이블로 뺀다. 두 테이블은 같은 기본 키를 갖는 1:1 관계가 된다 | 크기가 매우 큰 컬럼(긴 텍스트, 이미지)이나 거의 쓰지 않는 컬럼 때문에 디스크 I/O 가 많을 때, 자주 쓰는 컬럼과 드물게 쓰는 컬럼을 가를 때 |
| 수평 분할(행 분할) | 행을 나누어 같은 구조의 테이블 여러 개에 나누어 담는다 | 기간·지역·코드별로 접근 범위가 뚜렷할 때. DBMS 의 파티셔닝 기능으로 대신하는 경우가 많다 |
- 큰 컬럼을 별도 테이블로 떼어 내는 것은 수직 분할이다. 수평 분할이라고 하면 틀린다.
- 데이터 접근 빈도에 따라 테이블을 나누는 부분 테이블 분할도 반정규화 기법이다. 정규화 기법이 아니다.
- Microsoft 의 데이터 분할 지침도 행을 나누는 수평 분할(샤딩)과 컬럼을 나누는 수직 분할을 같은 기준으로 구분하며, 자주 함께 쓰는 컬럼을 한 파티션에 두어 I/O 를 줄이라고 권한다.[1]
- 중복 테이블 추가 - 다른 업무나 다른 서버의 테이블을 복제해 두어 원격 조인을 없앤다.
- 통계(집계) 테이블 추가 - SUM, AVG 같은 집계 결과를 미리 저장해 둔다.
- 이력 테이블 추가 - 마스터 테이블의 레코드를 이력 테이블에 중복해 둔다.
- 부분 테이블 추가 - 자주 쓰는 컬럼만 모은 별도 테이블을 만든다.
- 접근 경로를 줄이려고 부모 테이블의 컬럼을 자식 테이블에 중복시킨다. 조인 없이 자식 테이블만 읽어 처리할 수 있다.
- 파생 컬럼(계산 결과), 이력 테이블의 최신값 표시 컬럼, PK 에 의미가 섞여 있을 때 그 의미를 따로 뺀 컬럼, 응용 오류에 대비한 복구용 컬럼을 추가할 수 있다.
- 반드시 정규화 수행 후 반정규화 수행
- 튜닝 등 다른 개선 후 최후의 수단으로 수행
- ↑ 「Data partitioning guidance」, Microsoft Learn(Azure Architecture Center), https://learn.microsoft.com/en-us/azure/architecture/best-practices/data-partitioning, 확인일: 2026-11-04.