정보처리기사/데이터베이스 구축

물리 데이터베이스 설계 3

RangA 2023. 5. 28. 19:44

03. 반정규화 수행

01. 반정규화(De-Normalization)

1) 반정규화의 정의

  • 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상과 개발 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법
  • 완벽한 수준의 정규화 모델링을 수행하면 종속성, 활용성은 향상되더라도 처리 속도가 느려질 수 있기 때문에, 이런 경우를 극복하기 위해 성능에 중점을 두어 정규화하는 방법을 반정규화라고 함

2) 반정규화의 특징

  • 정규화된 데이터 모델링 규칙에 구애받지 않고 수행함
  • 물리적으로 구현되었을 때 성능 향상을 목적으로 함
  • 논리 모델링에서 수행된 정규화 작업을 통해 데이터 모델은 데이터 중복의 최소화와 데이터의 일관성, 정확성, 안정성 등을 보장하는 데이터 구조를 완성할 수 있음
  • 반정규화는 정규화된 데이터 모델이 시스템의 성능 향상, 개발 과정의 편의성, 운영의 단순화를 목적으로 수행되는 의도적인 정규화 원칙에 위배되는 행위를 의미함
  • 반정규화된 데이터 구조는 성능 향상과 관리의 효율성이 증가하는 장점이 있으나, 데이터의 일관성 및 정합성 저하와 유지를 위한 비용이 별도로 발생하여 과도할 경우 오히려 성능에도 나쁜 영향을 미칠 수 있음
  • 반정규화를 위해서는 사전에 데이터 모델 각각의 구성 요소인 개체, 속성, 관계에 대해 데이터의 일관성과 무결성을 우선으로 할지 데이터베이스의 성능과 단순화에 우선순위를 둘 것인지를 비교하여 조정하는 과정이 매우 중요함

3) 반정규화 사용 시기

  • 정규화에 충실하였으나 처리 속도에 문제가 있는 경우
  • 다량의 범위를 자주 처리해야 하는 경우
  • 특정 범위의 데이터만 자주 처리하는 경우
  • 처리 범위를 줄이지 않고는 처리 속도를 개선할 수 없는 경우
  • 요약 자료만 주로 요구되는 경우
  • 추가된 테이블의 처리를 위한 오버헤드를 고려하여 결정함
  • 인덱스의 조정이나 부분 범위 처리로 유도하고, 클러스터링을 이용하여 해결할 수 있는지를 철저히 검토 후 결정함



02. 반정규화(De-Normalization) 유형

1) 중복 테이블 추가

  1. 중복 테이블 추가 용도
    • 다량의 범위를 자주 처리하는 경우에 활용함
    • 특정 범위의 데이터만 자주 처리되는 경우에 활용함
    • 처리 범위를 줄이지 않고는 수행 속도를 개선할 수 없는 경우에 활용함
    • 데이터베이스를 활용하다 보면 대량의 데이터들에 대해 집계 함수를 사용하여 실시간 통계 정보를 계산하는 경우가 자주 발생함
    • 대부분의 경우 이러한 대상 데이터는 매우 많은 양인 경우가 대부분이며, 단일 테이블 보다는 다수의 테이블에서 필요한 데이터를 추출하여 활용하는 경우가 대부분
    • 작업의 효과적인 수행을 위해 별도의 통계 테이블이나 중복 테이블을 추가할 수 있음
  2. 집계(통계) 테이블을 추가하는 방법
    • 활용하고자 하는 집계 정보를 위한 테이블을 추가하고, 각 원본 테이블에 트리거를 등록시켜 생성하여 활용하는데, 이때 트리거의 오버헤드에 유의해야 함
    • 행의 수와 활용도를 분석하고 시뮬레이션을 통해서 그 효용성에 대한 면밀한 검토가 선행되어야 함
    • 집계 테이블에 단일 테이블 클러스터링을 한다면 집계 레벨을 좀 더 낮춰 활용도를 높일 수 있는지를 검토해야 함
    • 클러스터링, 결합 인덱스, 고단위 SQL을 활용하면 굳이 집계 테이블 없이도 양호한 수행 속도를 낼 수 있음
    • 데이터베이스 트리거의 오버헤드에 주의하고 데이터의 일관성 보장에 유의해야 함
    • 집계 테이블과 원본 데이터는 일관성 유지가 매우 중요함
    • 집계 테이블 유형에는 단일 테이블의 GROUP BY, 여러 테이블의 조인 GROUP BY가 있음
  3. 진행 테이블 추가 상황 확인
    • 여러 테이블의 조인이 빈번히 발생하며 처리 범위가 넓은 경우에 추가함
    • M:N 관계가 포함된 처리 과정을 추적, 관리하는 경우에 추가함
    • 검색 조건이 여러 테이블에 걸쳐 다양하게 사용되며 복잡하고 처리량이 많은 경우에 추가함
  4. 진행 테이블 생성 시 유의사항 확인
    • 데이터양이 적절하고 활용도가 좋아지도록 기본키를 선정함
    • 필요에 따라 적절한 추출 컬럼을 추가하여 집계 테이블의 역할도 하는 다목적 테이블을 구성함
    • 다중 테이블 클러스터링이나 조인 SQL을 적절히 이용하면 굳이 진행 테이블을 만들지 않아도 양호한 수행 속도를 낼 수 있는 경우가 많음
    • 이력 관리 등의 목적으로 사용되며 활용도가 좋아지도록 기본키를 적절히 설정해야 함
  5. 특정 부분만 포함하는 테이블을 추가하는 방법
    • 거대한 테이블의 특정 부분만을 사용하는 경우 자주 사용되는 부분으로 새로운 테이블을 생성하여 활용함
  6. 테이블 추가 시 고려사항
    • 요약 자료만 주로 요구되는 경우 고려하여 결정함
    • 추가된 테이블의 처리를 위한 오버헤드를 고려하여 결정함
    • 인덱스의 조정이나 부분 범위 처리로 유도, 클러스터링을 이용하여 해결할 수 있는지를 철저히 검토한 후 결정함

2) 테이블 조합

  1. 테이블 조합 용도
    • 두 개 이상의 테이블이 매번 같이 사용되는 경우에 활용함
  2. 테이블을 조합하는 방법
    • 해당 테이블들을 통합하여 설계함
  3. 테이블 조합 시 고려사항
    • 접근이 간단할 수 있지만 행의 수가 많아 처리량이 증가하는 경우가 발생할 수 있음
    • 입력, 수정, 삭제 규칙이 복잡해질 수 있음
    • NOT NULL, Default, Check 등의 제약조건을 완벽하게 설계하기 어려움

3) 테이블 분할

  1. 테이블 분할 용도
    • 열(Column)별로 사용 횟수가 차이가 많은 경우에 활용함
    • 사용자마다 사용하는 특정한 부분이 있는 경우에 활용함
    • 슈퍼 타입을 모두 내려 서브 타입별로 분할하거나 슈퍼 타입만 따로 테이블을 생성하는 경우에 활용함
    • 테이블 분할은 테이블을 수직 또는 수평으로 분할하는 것으로 파티셔닝이라고 함
  2. 수평 분할(Horizontal Partitioning)
    • 테이블 분할에 레코드(Record)를 기준으로 활용하는 것
    • 특정 범위별 사용 횟수의 차이가 많은 경우 해당 범위별로 테이블을 분할하는 방법
    • 하나의 테이블에 데이터가 너무 많이 있고, 레코드 중에서 특정한 범위만을 주로 액세스하는 경우에 사용함
    • 분할된 각각의 테이블은 서로 다른 디스크에 위치시켜 물리적인 디스크의 효용성을 극대화할 수 있음
    • 수평 테이블 분할은 DBMS 차원에서 제공하고 있음
    • 수평 테이블 분할의 대표적인 방법으로는 범위 분할, 해시 분할, 복합 분할 등의 기법이 사용됨
  3. 수직 분할(Vertical Partitioning)
    • 테이블 분할에 열(Column)을 기준으로 활용하는 것
    • 열 별로 사용 횟수의 차이가 많은 경우 자주 사용되는 열들과 그렇지 않은 열로 분류하여 테이블을 분할하는 방법
    • 하나의 테이블이 가지는 열의 개수가 많아지기 때문이 일어남
    • 조회 위주의 컬럼과 갱신 위주의 컬럼으로 나뉘는 경우에 활용함
    • 특별히 자주 조회되는 열이 있는 경우에 활용함
    • 특정 열 크기가 아주 큰 경우에 활용함
    • 특정 열에 보안을 적용해야 하는 경우에 활용함
  4. 갱신 위주의 열(Column) 분할
    • 갱신 위주의 컬럼들을 분할하는 이유는 데이터를 갱신하는 작업이 일어날 때 갱신하려는 레코드의 잠금을 처리하기 위함
    • 일부 DBMS의 경우 잠금 작용이 레코드 전체에 걸리는 경우가 있기 때문에 업데이트 완료까지 레코드의 사용이 불가능한 요인으로 작용됨
    • 열에 대한 갱신 위주의 몇몇 작업이 나머지 조회 위주의 작업을 방해하게 되는 경우에는 갱신 위주의 컬럼들을 수직 분할하여 사용하는 방법이 데이터 사용의 효율성 향상에 도움이 됨
  5. 조회 빈도가 높은 열(Column) 분할
    • 특정 열의 조회 빈도가 높다면 해당 열을 분리하여 별도의 테이블로 관리하여 조회 쿼리의 성능을 높일 수 있음
    • 특정 테이블에 열 수가 매우 많지만 조회 빈도가 소수의 열들에 집중된다면 조회 빈도가 높은 열로 이루어진 테이블의 생성을 통해 실제 물리적인 입출력의 양을 감소시켜 데이터 액세스 성능을 향상시킬 수 있음
    • DBMS는 액세스하고자 하는 데이터를 초기에 물리적인 데이터 파일에서 메모리로 읽어 들이는 과정을 수행하고 읽혀진 데이터는 바로 지워지는 것이 아니라 일정 기간 메모리에 남아있게 됨
    • 열의 수가 적은 테이블을 자주 읽는 작업을 많이 한다면 초기 데이터를 메모리로 적제하는 비용을 절약할 수 있음
    • 메모리에 상대적으로 오래 저장할 수 있기 때문에 데이터 재사용성을 향상시키는 효과를 얻을 수 있음
  6. 크기가 매우 큰 열(Column) 분할
    • 크기가 아주 큰 열이 있는 경우 분할이 발생하는 대부분의 경우는 열의 크기보다는 특정한 데이터 형식이 원인인 경우가 대부분
    • 문자열을 저장하기 위해 지원하는 데이터 타입은 2GB 이상 저장할 수 있고, 이미지 데이터를 저장할 수도 있음
    • 텍스트 및 이미지 등의 LOB(Large Objects) 데이터 형식을 지원하는 방법은 DBMS마다 조금씩 차이가 있음
    • 테이블의 열에 텍스트 및 이미지 데이터가 포함될 때는 일반적으로 성능이 저하될 수 있음
    • 백업, 복원과 같은 관리나 프로그래밍과 같은 개발 부분에서 다양한 성능 저하 요인으로 작용할 수 있음
  7. 보안 적용 열(Column) 분할
    • 일반적으로 DBMS에서는 테이블이나 뷰와 같은 객체들에 대해서는 SELECT, UPDATE, DELETE 등과 같은 권한 제어 기능을 제공하고 있음
    • 테이블 내의 열에 대해서는 테이블과 같은 권한 제어 가능을 제공하지 않는 것이 일반적
    • 열에 대한 권한을 제어하기 위해 보안 적용 대상 열을 분리해 별도의 테이블로 생성하여 수직 분할할 수 있음
  8. 테이블 분할 시 고려사항
    • 특정 열 또는 범위를 사용하지 않는 경우 처리 속도에 많은 영향이 있음을 고려함
    • 기본키의 유일성 관리가 어려워짐
    • 접근 빈도나 처리할 데이터의 양이 적은 경우는 분할하지 않음
    • 분할된 테이블의 처리 속도가 느려질 수도 있음
    • 데이터 프로세싱 관점이 아닌 검색에 중점을 둠

4) 테이블 제거

  1. 테이블 제거 용도
    • 테이블 재정의나 열의 중복화로 접근이 되지 않는 경우에 활용함
  2. 테이블 제거 방법
    • DROP 명령으로 제거
  3. 테이블 제거 시 고려사항
    • 관리 소홀이나 누락시키는 경우 발생함
    • 유지보수 단계에서 많이 발생함
    • 예상하지 못했던 새로운 요구사항이 증가하게 될 경우 급하게 테이블의 추가나 변경이 일어나게 되어 일관성과 통합성이 무너지게 되는 경우에 활용함

5) 열(Column)의 중복화

  1. 열의 중복화 용도
    • 대량 데이터에서 성능 향상을 위한 파생 열이 추가될 경우에 활용함
    • 자주 사용되는 액세스 조건이 다른 테이블에 분산되어 있어 상세한 조건 부여에도 불구하고 액세스 범위를 줄이지 못하는 경우에 활용함
    • 자주 사용되는 조건들을 하나의 테이블로 모아서 조건의 변별성을 극대화할 수 있음
    • 기본키의 형태가 적절하지 않은 경우에 활용함
    • 너무 많은 열로 구성된 경우에 활용함
    • 성능 향상을 목적으로 한 반정규화를 통한 중복 데이터를 허용하는 경우에 활용함
    • 데이터의 일관성을 위해서 복사된 열의 도메인은 원본 컬럼과 동일하게 해야 함
    • 접근 경로의 단축을 위해서 부모 테이블의 열을 자식 테이블에 중복시킬 수 있음
    • 상위 레벨의 테이블에 집계된 열을 추가(M:1 관계)할 수 있음
    • 하위 레벨의 테이블에 중복된 열을 복사(M:1 관계)할 수 있음
    • 연산된 결과를 주로 사용하는 경우, 미리 연산을 하여 중복 열을 생성할 수 있음
    • 빈번하게 조인을 일으키는 열에 대해서 고려해 볼 수 있음
    • 조인의 범위가 다량인 경우를 온라인화해야 하는 경우처럼 속도가 중요한 열에 대해서는 중복 열을 고려할 수 있음
    • 액세스의 조건으로 자주 사용되는 열에 대해서 고려해 볼 수 있음
  2. 열의 중복화 방법
    • 필요한 해당 테이블에 열을 추가함
  3. 열의 중복 시 고려사항
    • 테이블 중복과 열의 중복을 고려함
    • 데이터 일관성 및 무결성에 유의해야 함
    • SQL Group Function을 이용하여 해결 가능한지 검토해야 함
    • 저장 공간의 지나친 낭비를 고려해야 함