관계형 데이터 모델링 노트 7장
'데이터모델링 도서인 `관계형 데이터 모델링 노트 개정판` 책의 `7장 이력 데이터 이야기` 요약 및 정리
1. 엔터티 이야기
2. 정규화 이야기
3. 데이터 통합과 서브타입 이야기
4. 속성 이야기
5. 관계 이야기
6. 이력 데이터 이야기
7. 비정규화 이야기
-
비정규화(Denormalization)
-
비정규화 개요
-
비정규화는 정규화의 연장선에 있는 과정으로써 조회 성능만을 향상시키기 위해 데이터를 중복하거나 그룹핑 하며, 단순히 사용 편이를 위해 사용되어서는 안됨
-
비정규화라는 용어보다 일반적으로 반정규화, 역정규화 등을 많이 사용되며, 정규화를 역으로 적용하는 것 이상의 의미가 내포됨
-
중복 데이터는 원천데이터와 정합성을 맞춰야 함
-
조회 성능은 향상되지만 데이터 정합성 문제, 데이터 품질 문제, 모델의 가독성 문제, 모델의 확장성 문제, DB 공간 문제, 쓰기 성능 문제 등 많은 단점이 존재하므로 비정규형은 매우 신중하게 선택적으로 사용해야 함
-
-
비정규화 방법
-
정규화를 거꾸로 적용한 역정규화(Reverse-Normalization) 방법
-
정규형 모델에 중복 속성을 채택하는 방법
-
-
비정규화 원칙
-
최우선적으로 고려할 요소는 데이터 무결성
-
정규형은 필수며, 성능 문제가 있을 떄만 비정규형을 채택
-
중복 속성은 가능한 사용하지 않으며, 추출 속성은 일부 사용할 수 있음
-
-
비정규형의 단점 7가지
-
정합성 유지
-
중복 속성은 항상 원본 속성의 값으로 맞춰야하지만, 중복된 데이터가 늘어 날 수록 데이터의 정합성이 저하되어 결과적으로 데이터의 품질이 떨어지게 됨
-
중복된 데이터가 적더라도 정도의 차이가 있을 뿐 데이터 품질은 자연히 저하될 수 밖에 없음
-
실무에서는 어떤 이유에서든 데이터 정합성이 꺠져 있는 경우가 빈번
-
-
쓰기 성능 저하
-
비정규화의 목적은 오직 읽기(Read: Select) 성능을 향상시키는 것으로, 쓰기 성능을 포기할 만큼 읽기 성능 문제가 큰지 잘 따져봐야 함
-
비정규화를 사용하더라도 트리거를 사용해서 부작용 없이 사용할 수 있을 정도가 기준이 되어야 함
-
-
불명확한 데이터 성격
-
엔터티 내 많은 중복 속성 떄문에 엔터티의 성격이 흐려질 수 있고, 엔터티의 성격이 흐려지면 제 3자가 보았을 떄 이해하기 어려움
-
이해하기 어려운 모델은 사용할수록 점점 더 복잡해져 결국 조잡한 모델이 되기 쉬움
-
-
모델 확장성 저하
-
군더더기 없은 정규형에 비해 비정규형은 군더더기가 많으며 이를 수정하는 것은 어렵기 떄문에 확장성이 떨어짐
-
비정규형 위주로 이루어진 모델은 어디를 수정해야 하는지 정확히 모르기 때문에 유지·보수가 어려워지며 제대로 하긴 더욱 어려워짐
-
-
개발 어려움
-
비정규형을 채택하면 개발이 쉽다는 얘기는 원천 데이터와 정합성을 체크하지 않기 떄문이며, 이는 있어서는 안 되는 일임
-
중복 속성을 남발하면 개발할 당시에는 조인이 없으므로 편할지 몰라도 막상 운영하다 보면 중복된 데이터를 완벽하게 일치시키기가 쉽지 않아 문제가 됨
-
-
DB 저장공간 차지
-
인스턴스가 적은 엔터티는 큰 문제가 안 될 수 있지만, 인스턴스가 수억 건이 되는 엔터티는 20bytes 문자만 중복돼도 수십 Gbytes의 공간이 필요함
-
DB 공간을 많이 차지하면 일반적으로 성능에 나쁜 영향을 미침
-
-
일부 조회 성능 저하
-
데이터 중복 시 하나의 블록에 존재할 인스턴스가 두 개의 블록에 존재할 수 있음
-
조회할 떄 여러 블록을 사용하면 속도가 늦어짐
-
비정규화를 하는 것이 반드시 조회 성능을 좋게하는지는 요건에 따라 달라질 수 있어 심사숙고해야함
-
실제 데이터로 벤치마크하지 않는 한 좋고 나쁨을 단언 할 수 없음
-
-
-
비정규화 과정 5단계
-
함수 종속을 적용해 정규화
-
성능 문제 발생 요건 도출
-
비정규화 외 다른 방안 검토
-
뷰를 사용해서 조인 문제를 해결할 수 있는지 검토
-
파티션으로 데이터를 나눠서 해결할 수 있는지 검토
-
클러스터링이나 IOT(Index Oriented Table) 같은 특수 형태의 테이블을 사용해서 해결할 수 있는지 검토
-
인덱스를 조정하거나 힌트(Hint) 등으로 해결할 수 있는지 검토
-
그밖에 DBMS의 최신 기술을 적용해 해결할 수 있느니 검토
-
-
비정규화 수행
-
정합성 구현 방안 검토
-
-
-
비정규화 방법
-
역정규화
-
엔터티 합체
-
엔터티 분해 - 수직
-
엔터티 분해 - 수평
-
요약 엔터티
-
추출 속성
-
반복 속성
-
중복 데이터
-
시스템 속성 삭제
-
슈퍼타입 엔터티의 속성과 서브타입 엔터티 간 속성 이동
-
-
비정규화 방법 - 역정규화
-
롤다운 역정규화(Roll-Down Denormalization)
-
하위(자식) 엔터티를 기준으로 역정규화하는 것
-
-
롤업 역정규화(Roll-Up Denormalization)
-
상위(부모) 엔터티를 기준으로 역정규화 하는 것
-
-
-
비정규화 방법 - 엔터티 합체
-
일대일(1:1) 관계의 엔터티가 주를 이루며, 간혹 일대다(1:M) 관계의 엔터티도 대상이 됨
-
엔터티를 합칠 때 성격이 같은지, 추후에 관계비가 바뀔 수 있는지 검토
-
일대다(1:M) 관계의 엔터티는 보통 하위(자식) 엔터티를 기준으로 상위(부모) 엔터티를 합치는데, 상위(부모) 에넡티의 속성 개수가 많으면 엔터티를 합체하는 것이 적당하지 않음
-
-
비정규화 방법 - 엔터티 분해
-
엔터티 분해 개요
-
중복 데이터가 발생하지 않는 비정규화 방법
-
로우 체이닝이나 로우 마이그레이션이 생기지 않는 방향으로 엔터티 설계
-
로우 체이닝(Row Chaining) - 전체 속성 사이즈가 블록 사이즈를 넘으면 두 개의 블록에 저장될 때
-
로우 마이그레이션(Row Migration) - 한 블록에 저장되더라도 속성이 업데이트될 때 데이터가 커지면 다른 블록에 저장할 때
-
-
-
수직 분해
-
엔터티의 속성을 별도의 엔터티로 분해하는 것
-
일대일(1:1) 관계로 분해하는 이유는 한 블록에 중요한 인스턴스를 많이 저장할 수 있기 떄문
-
-
수직분해 기준
-
사용빈도
-
특별한 데이터 타입
-
널(Null)이 발생할 수 있는 속성
-
속성의 중요도
-
업무에서 사용되는 속성별(락(Lock) 발생 최소화)
-
전체 속성 사이즈가 기본 블록 사이즈를 초과 할 때(로우 체이닝, 로우 마이그레이션 발생 방지)
-
-
수평 분해
-
엔터티의 특정 인스턴스를 별도의 엔터티로 분해 하는것으로 파티셔닝(Partitioning)으로 구현됨
-
-
수평 분해 방법
-
파티셔닝
-
파티션된 조각은 하나의 논리적인 엔터티로 존재
-
-
특정 기준에 따라 엔터티 인스턴스를 분리해서 다른 엔터티로 이동시키는 것
-
엔터티를 아예 물리적으로 분리해서 관리
-
-
-
-
비정규화 방법 - 요약 엔터티
-
요약 엔터티 개요
-
요약 엔터티는 원천 엔터티를 대상으로 합계나 집계 등 미리 계산한 데이터를 저장한 엔터티
-
미리 계산한 데이터도 데이터를 중복해서 관리하는 방법이어서 데이터 정합성을 주의 해야함
-
하지만 중복 데이터라고 보기 어려운 요약 엔터티도 있음
-
-
요약 엔터티의 정합성을 맞추는 방법
-
실시간으로 요약 엔터티의 데이터를 수정하는 방법
-
배치로 요약 엔터티의 데이터를 맞추는 방법
-
-
-
비정규화 방법 - 추출 속성
-
추출 속성 개요
-
추출 속성을 사용하는 목적은 미리 추출(계산)해서 보관한 값을 필요한 시점에 사용하기 위한것으로 추출 속성과 중복 속성은 구별됨
-
추출 속성은 주로 하위(자식) 에넡티에서 많은 데이터(인스턴스)를 읽어서 연산 한 후 값을 상위(부모) 엔터티의 속성으로 가져다 놓은 속성을 말함
-
추출 속성은 성능에 많은 영향을 미치므로 채택 여부를 숙고해야함
-
-
추출 속성의 유형
-
총 횟수
-
처음 값
-
최종 값
-
더한 값
-
현재 값
-
이전 값
-
다음 값
-
추출 관계
-
여부 값
-
여부 속성은 생각보다 정합성을 맞추기 어려워서 가능하면 지양
-
-
주 식별자 값의 체계와 동일한 의미의 값(체계가 있는 값)
-
-
-
이전 값을 관리하는 방법
-
이력 엔터티에 현재 유효한 데이터를 중복으로 관리하는 방법
-
원천 엔터티에 이전 값을 관리하는 방법
-
-
비정규화 방법 - 추출 엔터티
-
추출 속성을 사용하는 방법과 유사함
-
추출 엔터티는 추출 속성을 묶어서 사용하는 개념으로 현재 유효한 인스턴스와 속성만 추출해서 관리하는 엔터티
-
-
비정규화 방법 - 반복 속성
-
반복 속성 개요
-
조회 화면이 [1-Row]이냐 [N-Row] 냐에 따라서 정규형 비정규형을 사용
-
조회 화면이 다양한 형태로 여러 개 존재할 떄는 중요도와 빈도에 따라 전략적으로 선택
-
화면과 관련된 성능 이슈는 화면 구성이나 조회 방법 등을 바꿀 수 있는지 먼저 검토
-
반복되는 속성이 한정돼 있을 때 사용할 수 있으며, 여러개의 속성이 묶여서 반복될 경우 정규화를 하는것이 좋음
-
-
반복 속성 유형
-
롤업 역정규화
-
단순 비정규화
-
-
-
비정규화 방법 - 중복 데이터
-
중복 데이터 사용 방법
-
데이터 중복 관리
-
조회 효율을 위해 현재 시점의 데이터와 이력 데이터가 동시에 존재
-
-
엔터티 및 데이터 중복 관리
-
업무 처리를 위한 대상을 뽑기 위해
-
복구 대비
-
다른 서버의 DB에서 원격 조인을 피하기 위해
-
조회 성능을 향상시키기 위해
-
-
-
-
비정규화 방법 - 시스템 속성 삭제
-
비정규화 방법 - 슈퍼타입 엔터티의 속성과 서브타입 엔터티 간 속성 이동
Twitter
Google+
Facebook
Reddit
LinkedIn
StumbleUpon
Email