관계형 데이터 모델링 노트 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. 비정규화 방법 - 슈퍼타입 엔터티의 속성과 서브타입 엔터티 간 속성 이동