본문 바로가기

컴퓨터 공학/데이터베이스

반정규화 De-normalization

1. 반정규화 기본 개념

  • 데이터 무결성을 희생하고, 데이터 중복을 허용하여 조인을 줄여 조회 성능을 향상시키는 방법
  • 시스템 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터모델을 통합, 중복, 분리하여 의도적으로 정규화 원칙을 위배하는 행위
  • 절차
    1. 반정규화 대상 조사
    2. 뷰, 클러스터링, 인덱스, 애플리케이션 등 다른 성능 향상 방법 검토
    3. 반정규화 적용

2. 테이블 병합

  • 자주 조인되는 두 개의 테이블을 하나로 합치는 것
  • 특징
    • 데이터 조회 성능은 향상
    • 중복 데이터가 생겨 처리량이 증가
    • not null, default,check 등 제약 조건 설계가 어려움
  • 종류
    1. 1:1 관계 테이블 병합 : 병합했을 때 이행적 종속이 발생하더라도 자주 변경되는 정보가 아니고 조회시 조인이 자주되는 경우가 많은 경우 병합
    2. 1:N 관계 테이블 병합 : 많은 양의 데이터 중복 발생
    3. 슈퍼타입/서브타입 테이블 병합

3. 테이블 분할

  • 특징
    • 기본키의 유일성 관리가 어려워짐
    • 데이터 양이 적거나 사용 빈도가 낮은 경우는 권장하지 않음
    • 분할된 테이블을 조인하느라 수행 속도가 느려짐
    • 데이터 검색에 중점을 두어 분할 여부를 결정해야 함
  • 종류
    1. 수직 분할 : 하나의 테이블에 속성이 너무 많은 경우, 칼럼을 기준으로 테이블 분할
      1. 갱신 위주의 속성 분할 : 데이터 갱신시 해당 행(로우)에 lock이 걸려서 다른 작업을 할 수 없으므로, 자주 갱신이 일어나는 속성들을 수직 분할
      2. 자주 조회되는 속성 분할 : 자주 조회되는 속성이 극히 일부일 경우
      3. 크기가 큰 속성 분할 : 이미지나, 2GB이상 저장될 수 있는 텍스트 형식으로 된 속성
      4. 보안을 적용해야 하는 속성 분할
    2. 수평 분할 : 행(튜플,레코드)를 기준으로 분할, 행별 사용 빈도 차이가 큰 경우 빈도에 따라 테이블 분할

4. 중복 테이블 추가

  • 여러 테이블에서 테이터를 추출해서 사용해야 하거나 다른 서버에 저장된 테이블을 이용해야 하는 경우 중복 테이블 추가 → 조호 성능 높임
  • 중복 테이블을 추가하는 경우
    • 정규화로 인해 수행 속도가 느린 경우
    • 많은 범위의 데이터를 자주 처리해야 하는 경우
    • 특정 범위의 데이터만 자주 처리해야 하는 경우
    • 처리 범위를 줄이지 않고는 수행속도를 개선할 수 없는 경우
  • 종류
    1. 중복 테이블 : 업무나 서버가 다를 때 중복 테이블 생성 (원격 조인 제거)
    2. 통계 테이블 : 집계 데이터를 위한 테이블을 생성하고 각 원본 테이블에 트리거를 설정해서 사용, 트리거 오버헤드를 유의해야 함
    3. 이력 테이블 : 적절한 데이터 양의 유지와 활용도를 높이기 위해 기본키를 적절히 설정해야 함
    4. 부분 테이블 : 자주 사용하는 칼럼으로 구성된 테이블 생성

5. 칼럼 반정규화 / 중복 속성 추가

  • 조인해서 데이터 처리할 때 데이터 조회 경로를 단축하기 위해 자주 사용되는 속성을 하나 더 추가하는 것
  • 특징
    • 데이터 무결성을 저해
    • 디스크 공간이 추가로 필요
    • SQL 그룹 함수를 이용해서 처리할 수 있어야 함
  • 중복 속성을 추가하는 경우
    • 조인이 자주 발생하는 경우
    • 접근 경로가 복잡한 경우
    • 액세스의 조건으로 자주 사용되는 속성
    • 기본키가 복합키인 경우
  • 종류
    1. 중복 칼럼 추가
    2. 파생 칼럼 추가 : 필요한 값을 미리 계산한 칼럼 추가
    3. 이력 테이블 칼럼 추가
    4. 기본키에 의한 칼롬 추가 : PK의 종속자를 일반 속성으로 생성
    5. 응용 시스템의 오작동을 위한 칼럼 추가

6. 관계 반정규화

  • 데이터 무결성 보장 가능
  • 종류
    1. 중복 관계 추가 : 이미 어떤 테이블에서 다른 테이블의 정보를 읽을 수 있는 관계가 있음에도 관계를 중복하여 조회 경로를 단축