본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.


Denormalization
데이터베이스 성능 향상 등을 위해 정규화된 데이터를 의도적으로 정규형을 위배한 데이터 구조로 만드는 행위
  • 테이블 합병: 논리적으로 구분된 엔티티들을 하나의 테이블로 합친다.
    • 논리적 모델 상으론 구분되어야 하지만, Join 없이 하나의 테이블로 관리하는 것이 성능 측면에서 유리할 수 있다.
  • 중복 칼럼 추가: 게시판 테이블에 회원 정보를 일부 저장한다.
    • 회원 정보 테이블과 Join 하여 불러올 수 있지만, 일부 중복 데이터만으로 Join 없이 처리한다면 더 유리할 수 있다.
  • 계산된 칼럼 추가: 평균치, 계량값을 특정 필드에 추가한다.
    • 바로바로 계산할 수 있는 값이지만, 자주 참조되는 값이라면 DB에 저장해두는 것이 유리할 수 있다.
  • 코드 명칭 칼럼 추가: 남자 여자를 F, M이 아니라 그냥 남자, 여자로 저장한다.
    • 출력 시 '남자' '여자'로 보여줘야 하는 경우 연산을 줄일 수 있다.

하나의 테이블을 성능을 위해 여러 테이블로 쪼개는 것도 반정규화에 속한다. 정규화처럼 이상 현상을 없애려는 것이 아니라 접근 성능을 높이려는 것이기 때문이다.

기법 나누는 방향 쓰는 경우
수직 분할(컬럼 분할) 컬럼을 나누어 일부 컬럼을 별도 테이블로 뺀다. 두 테이블은 같은 기본 키를 갖는 1:1 관계가 된다 크기가 매우 큰 컬럼(긴 텍스트, 이미지)이나 거의 쓰지 않는 컬럼 때문에 디스크 I/O 가 많을 때, 자주 쓰는 컬럼과 드물게 쓰는 컬럼을 가를 때
수평 분할(행 분할) 행을 나누어 같은 구조의 테이블 여러 개에 나누어 담는다 기간·지역·코드별로 접근 범위가 뚜렷할 때. DBMS 의 파티셔닝 기능으로 대신하는 경우가 많다
  • 큰 컬럼을 별도 테이블로 떼어 내는 것은 수직 분할이다. 수평 분할이라고 하면 틀린다.
  • 데이터 접근 빈도에 따라 테이블을 나누는 부분 테이블 분할도 반정규화 기법이다. 정규화 기법이 아니다.
  • Microsoft 의 데이터 분할 지침도 행을 나누는 수평 분할(샤딩)과 컬럼을 나누는 수직 분할을 같은 기준으로 구분하며, 자주 함께 쓰는 컬럼을 한 파티션에 두어 I/O 를 줄이라고 권한다.[1]
  • 중복 테이블 추가 - 다른 업무나 다른 서버의 테이블을 복제해 두어 원격 조인을 없앤다.
  • 통계(집계) 테이블 추가 - SUM, AVG 같은 집계 결과를 미리 저장해 둔다.
  • 이력 테이블 추가 - 마스터 테이블의 레코드를 이력 테이블에 중복해 둔다.
  • 부분 테이블 추가 - 자주 쓰는 컬럼만 모은 별도 테이블을 만든다.

컬럼 중복의 형태

편집 원본 편집
  • 접근 경로를 줄이려고 부모 테이블의 컬럼을 자식 테이블에 중복시킨다. 조인 없이 자식 테이블만 읽어 처리할 수 있다.
  • 파생 컬럼(계산 결과), 이력 테이블의 최신값 표시 컬럼, PK 에 의미가 섞여 있을 때 그 의미를 따로 뺀 컬럼, 응용 오류에 대비한 복구용 컬럼을 추가할 수 있다.
  • 반드시 정규화 수행 후 반정규화 수행
  • 튜닝 등 다른 개선 후 최후의 수단으로 수행
  1. ↑ 「Data partitioning guidance」, Microsoft Learn(Azure Architecture Center), https://learn.microsoft.com/en-us/azure/architecture/best-practices/data-partitioning, 확인일: 2026-11-04.