Contents

관계형 데이터 모델링 노트 7장

데이터모델링 도서인 `관계형 데이터 모델링 노트 개정판` 책의 `7장 이력 데이터 이야기` 요약 및 정리


1. 엔터티 이야기

2. 정규화 이야기

3. 데이터 통합과 서브타입 이야기

4. 속성 이야기

5. 관계 이야기

6. 이력 데이터 이야기

7. 비정규화 이야기


요약
  1. 비정규화(Denormalization)

    1. 비정규화 개요

      • 비정규화는 정규화의 연장선에 있는 과정으로써 조회 성능만을 향상시키기 위해 데이터를 중복하거나 그룹핑 하며, 단순히 사용 편이를 위해 사용되어서는 안됨

      • 비정규화라는 용어보다 일반적으로 반정규화, 역정규화 등을 많이 사용되며, 정규화를 역으로 적용하는 것 이상의 의미가 내포됨

      • 중복 데이터는 원천데이터와 정합성을 맞춰야 함

      • 조회 성능은 향상되지만 데이터 정합성 문제, 데이터 품질 문제, 모델의 가독성 문제, 모델의 확장성 문제, DB 공간 문제, 쓰기 성능 문제 등 많은 단점이 존재하므로 비정규형은 매우 신중하게 선택적으로 사용해야 함

    2. 비정규화 방법

      • 정규화를 거꾸로 적용한 역정규화(Reverse-Normalization) 방법

      • 정규형 모델에 중복 속성을 채택하는 방법

    3. 비정규화 원칙

      • 최우선적으로 고려할 요소는 데이터 무결성

      • 정규형은 필수며, 성능 문제가 있을 떄만 비정규형을 채택

      • 중복 속성은 가능한 사용하지 않으며, 추출 속성은 일부 사용할 수 있음

    4. 비정규형의 단점 7가지

      1. 정합성 유지

        • 중복 속성은 항상 원본 속성의 값으로 맞춰야하지만, 중복된 데이터가 늘어 날 수록 데이터의 정합성이 저하되어 결과적으로 데이터의 품질이 떨어지게 됨

        • 중복된 데이터가 적더라도 정도의 차이가 있을 뿐 데이터 품질은 자연히 저하될 수 밖에 없음

        • 실무에서는 어떤 이유에서든 데이터 정합성이 꺠져 있는 경우가 빈번

      2. 쓰기 성능 저하

        • 비정규화의 목적은 오직 읽기(Read: Select) 성능을 향상시키는 것으로, 쓰기 성능을 포기할 만큼 읽기 성능 문제가 큰지 잘 따져봐야 함

        • 비정규화를 사용하더라도 트리거를 사용해서 부작용 없이 사용할 수 있을 정도가 기준이 되어야 함

      3. 불명확한 데이터 성격

        • 엔터티 내 많은 중복 속성 떄문에 엔터티의 성격이 흐려질 수 있고, 엔터티의 성격이 흐려지면 제 3자가 보았을 떄 이해하기 어려움

        • 이해하기 어려운 모델은 사용할수록 점점 더 복잡해져 결국 조잡한 모델이 되기 쉬움

      4. 모델 확장성 저하

        • 군더더기 없은 정규형에 비해 비정규형은 군더더기가 많으며 이를 수정하는 것은 어렵기 떄문에 확장성이 떨어짐

        • 비정규형 위주로 이루어진 모델은 어디를 수정해야 하는지 정확히 모르기 때문에 유지·보수가 어려워지며 제대로 하긴 더욱 어려워짐

      5. 개발 어려움

        • 비정규형을 채택하면 개발이 쉽다는 얘기는 원천 데이터와 정합성을 체크하지 않기 떄문이며, 이는 있어서는 안 되는 일임

        • 중복 속성을 남발하면 개발할 당시에는 조인이 없으므로 편할지 몰라도 막상 운영하다 보면 중복된 데이터를 완벽하게 일치시키기가 쉽지 않아 문제가 됨

      6. DB 저장공간 차지

        • 인스턴스가 적은 엔터티는 큰 문제가 안 될 수 있지만, 인스턴스가 수억 건이 되는 엔터티는 20bytes 문자만 중복돼도 수십 Gbytes의 공간이 필요함

        • DB 공간을 많이 차지하면 일반적으로 성능에 나쁜 영향을 미침

      7. 일부 조회 성능 저하

        • 데이터 중복 시 하나의 블록에 존재할 인스턴스가 두 개의 블록에 존재할 수 있음

        • 조회할 떄 여러 블록을 사용하면 속도가 늦어짐

        • 비정규화를 하는 것이 반드시 조회 성능을 좋게하는지는 요건에 따라 달라질 수 있어 심사숙고해야함

        • 실제 데이터로 벤치마크하지 않는 한 좋고 나쁨을 단언 할 수 없음

    5. 비정규화 과정 5단계

      1. 함수 종속을 적용해 정규화

      2. 성능 문제 발생 요건 도출

      3. 비정규화 외 다른 방안 검토

        • 뷰를 사용해서 조인 문제를 해결할 수 있는지 검토

        • 파티션으로 데이터를 나눠서 해결할 수 있는지 검토

        • 클러스터링이나 IOT(Index Oriented Table) 같은 특수 형태의 테이블을 사용해서 해결할 수 있는지 검토

        • 인덱스를 조정하거나 힌트(Hint) 등으로 해결할 수 있는지 검토

        • 그밖에 DBMS의 최신 기술을 적용해 해결할 수 있느니 검토

      4. 비정규화 수행

      5. 정합성 구현 방안 검토

  2. 비정규화 방법

    • 역정규화

    • 엔터티 합체

    • 엔터티 분해 - 수직

    • 엔터티 분해 - 수평

    • 요약 엔터티

    • 추출 속성

    • 반복 속성

    • 중복 데이터

    • 시스템 속성 삭제

    • 슈퍼타입 엔터티의 속성과 서브타입 엔터티 간 속성 이동

  3. 비정규화 방법 - 역정규화

    1. 롤다운 역정규화(Roll-Down Denormalization)

      • 하위(자식) 엔터티를 기준으로 역정규화하는 것

    2. 롤업 역정규화(Roll-Up Denormalization)

      • 상위(부모) 엔터티를 기준으로 역정규화 하는 것

  4. 비정규화 방법 - 엔터티 합체

    • 일대일(1:1) 관계의 엔터티가 주를 이루며, 간혹 일대다(1:M) 관계의 엔터티도 대상이 됨

    • 엔터티를 합칠 때 성격이 같은지, 추후에 관계비가 바뀔 수 있는지 검토

    • 일대다(1:M) 관계의 엔터티는 보통 하위(자식) 엔터티를 기준으로 상위(부모) 엔터티를 합치는데, 상위(부모) 에넡티의 속성 개수가 많으면 엔터티를 합체하는 것이 적당하지 않음

  5. 비정규화 방법 - 엔터티 분해

    1. 엔터티 분해 개요

      • 중복 데이터가 발생하지 않는 비정규화 방법

      • 로우 체이닝이나 로우 마이그레이션이 생기지 않는 방향으로 엔터티 설계

        • 로우 체이닝(Row Chaining) - 전체 속성 사이즈가 블록 사이즈를 넘으면 두 개의 블록에 저장될 때

        • 로우 마이그레이션(Row Migration) - 한 블록에 저장되더라도 속성이 업데이트될 때 데이터가 커지면 다른 블록에 저장할 때

    2. 수직 분해

      • 엔터티의 속성을 별도의 엔터티로 분해하는 것

      • 일대일(1:1) 관계로 분해하는 이유는 한 블록에 중요한 인스턴스를 많이 저장할 수 있기 떄문

    3. 수직분해 기준

      • 사용빈도

      • 특별한 데이터 타입

      • 널(Null)이 발생할 수 있는 속성

      • 속성의 중요도

      • 업무에서 사용되는 속성별(락(Lock) 발생 최소화)

      • 전체 속성 사이즈가 기본 블록 사이즈를 초과 할 때(로우 체이닝, 로우 마이그레이션 발생 방지)

    4. 수평 분해

      • 엔터티의 특정 인스턴스를 별도의 엔터티로 분해 하는것으로 파티셔닝(Partitioning)으로 구현됨

    5. 수평 분해 방법

      • 파티셔닝

        • 파티션된 조각은 하나의 논리적인 엔터티로 존재

      • 특정 기준에 따라 엔터티 인스턴스를 분리해서 다른 엔터티로 이동시키는 것

        • 엔터티를 아예 물리적으로 분리해서 관리

  6. 비정규화 방법 - 요약 엔터티

    1. 요약 엔터티 개요

      • 요약 엔터티는 원천 엔터티를 대상으로 합계나 집계 등 미리 계산한 데이터를 저장한 엔터티

      • 미리 계산한 데이터도 데이터를 중복해서 관리하는 방법이어서 데이터 정합성을 주의 해야함

      • 하지만 중복 데이터라고 보기 어려운 요약 엔터티도 있음

    2. 요약 엔터티의 정합성을 맞추는 방법

      • 실시간으로 요약 엔터티의 데이터를 수정하는 방법

      • 배치로 요약 엔터티의 데이터를 맞추는 방법

  7. 비정규화 방법 - 추출 속성

    1. 추출 속성 개요

      • 추출 속성을 사용하는 목적은 미리 추출(계산)해서 보관한 값을 필요한 시점에 사용하기 위한것으로 추출 속성과 중복 속성은 구별됨

      • 추출 속성은 주로 하위(자식) 에넡티에서 많은 데이터(인스턴스)를 읽어서 연산 한 후 값을 상위(부모) 엔터티의 속성으로 가져다 놓은 속성을 말함

      • 추출 속성은 성능에 많은 영향을 미치므로 채택 여부를 숙고해야함

    2. 추출 속성의 유형

      • 총 횟수

      • 처음 값

      • 최종 값

      • 더한 값

      • 현재 값

      • 이전 값

      • 다음 값

      • 추출 관계

      • 여부 값

        • 여부 속성은 생각보다 정합성을 맞추기 어려워서 가능하면 지양

      • 주 식별자 값의 체계와 동일한 의미의 값(체계가 있는 값)

  8. 이전 값을 관리하는 방법

    • 이력 엔터티에 현재 유효한 데이터를 중복으로 관리하는 방법

    • 원천 엔터티에 이전 값을 관리하는 방법

  9. 비정규화 방법 - 추출 엔터티

    • 추출 속성을 사용하는 방법과 유사함

    • 추출 엔터티는 추출 속성을 묶어서 사용하는 개념으로 현재 유효한 인스턴스와 속성만 추출해서 관리하는 엔터티

  10. 비정규화 방법 - 반복 속성

    1. 반복 속성 개요

      • 조회 화면이 [1-Row]이냐 [N-Row] 냐에 따라서 정규형 비정규형을 사용

      • 조회 화면이 다양한 형태로 여러 개 존재할 떄는 중요도와 빈도에 따라 전략적으로 선택

      • 화면과 관련된 성능 이슈는 화면 구성이나 조회 방법 등을 바꿀 수 있는지 먼저 검토

      • 반복되는 속성이 한정돼 있을 때 사용할 수 있으며, 여러개의 속성이 묶여서 반복될 경우 정규화를 하는것이 좋음

    2. 반복 속성 유형

      • 롤업 역정규화

      • 단순 비정규화

  11. 비정규화 방법 - 중복 데이터

    1. 중복 데이터 사용 방법

      1. 데이터 중복 관리

        • 조회 효율을 위해 현재 시점의 데이터와 이력 데이터가 동시에 존재

      2. 엔터티 및 데이터 중복 관리

        • 업무 처리를 위한 대상을 뽑기 위해

        • 복구 대비

        • 다른 서버의 DB에서 원격 조인을 피하기 위해

        • 조회 성능을 향상시키기 위해

  12. 비정규화 방법 - 시스템 속성 삭제

  13. 비정규화 방법 - 슈퍼타입 엔터티의 속성과 서브타입 엔터티 간 속성 이동