01. 성능 데이터 모델링
데이터 베이스 성능 향상을 목적으로 설계 단계의 데이터 모델링 때부터 성능과 관련된 사항이 데이터 모델링에 반영될 수 있도록 하는것
성능 데이터 모델링의 특징
- 데이터의 증가가 빠를수록 성능 저하에 따른 성능 개선 비용이 증가한다
- 데이터모델은 성능을 튜닝하면서 변경이 될 수 있다
- 분석/설계 단계에서 성능을 고려한 데이터 모델링을 수행할 경우 성능저하에 따른 Rework 비용을 최소화 할 수 있는 기회를 가지게 된다
성능 데이터 모델링 수행 절차
- 데이터 모델링을 할 때 정규화를 정확하게 수행한다
- 데이터 베이스 용량 산정을 수행한다
- 데이터 베이스에 발생되는 트랜잭션의 유형을 파악한다
- 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다
- 이력모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 등을 수행한다
- 성능관점에서 데이터 모델을 검증한다
02. 정규화
데이터 중복 제거, 데이터 분류 등을 위해 데이터를 구조화 시키는 과정
이상한 현상 제거 → 데이터 중복 제거, 데이터모델 유연성 향상
정규화 특징
- 정규화를 실행 한다면 데이터 조회 시 조인의 수가 증가한다
- 업무가 변경되도 모델의 유연성을 향상 시킨다
- 엔터티의 의미해석이 명확해 진다
- 테이블 수가 증가한다
- 모델의 독립성을 향상시킨다
정규화의 절차
제 1정규화 ~ 제 5정규화. 실제로는 제 3정규화까지만 수행을 한다
① 제 1정규화(1NF)
- 테이블의 중복을 제거
- 새로운 테이블을 추가 (PK추가)
- (기존 테이블과) 1:M 관계 형성
'기능분류코드' 속성 차원에서 같은 속성인데 칼럼 단위로 반복이 되고 있다
→ 1차 정규화 대상으로 새 테이블을 추가하여 분리할 수 있다 (모델, 모델유형기능분류는 1:M 관계를 형성한다)
② 제 2정규화(2NF)
- 기본키가 2개 이상의 속성일 때 부분 함수 종속성 제거
- PK가 2개 이상일 때, 종속되는 관계가 있다면 분리
부분함수종속성❓
테이블의 기본키가 학번, 책번호 속성으로 책이름, 학과, 이름 엔터티가 있다고 가정해보자.
학번이 바뀌면 이름과 학과가 바뀐다. 하지만 책 이름은 바뀌지 않는다.
책 번호가 바뀌면 책 이름이 바뀌지만 학과나 이름이 바뀌지는 않는다.
이렇게 부분적으로 함수들끼리 종속성이 있는걸 부분함부종속성 이라고 한다.
이것을 제거하기 위해 따로 분리 시킨다.
함수종속성(FD)❓
데이터들이 어떠한 기준에 의해서 종속되는 것을 의미
- 완전 함수적 종속: 기본키에 대해서 그 속성이 완전히 종속될 때
- 부분 함수적 종속: 기본키 전체가 아니라 일부에 대해 종속될 때
③ 제 3정규화(3NF)
이행 함수 종속성을 제거
기본 키에 의존하지 않고 일반 칼럼에 의존하는 칼럼이 있다면 이를 제거
이행함수종속성❓
기본 키를 제외한 속성 중 종속성이 발생하는 것
학과는 학과코드에 종속된다. 그러므로 제거하기 위해서 테이블을 분리한다.
직원 테이블에 기본 키인 '사원번호' 외 의존하는 칼럼이 있다.
부서코드와 부서이름은 '부서' 테이블에 속해야 할 사항이다.
→ 데이터가 중복되어, 저장 공간이 낭비되고 있다. 3차 정규화 진행
④ 보이스-코드 정규화(BCNF)
후보 키가 기본 키를 종속시킬 때 분해한다.
후보키<수강 교수>가 기본키<수강 과목>을 종속시키고 있기 때문에 분해를 시킨다
⑤ 제 4정규화(4NF)
컬럼 여러개가 하나의 컬럼에 종속 될 때 다중값 종속성을 제거한다
⑥ 제 5정규화(5NF)
조인종속의 경우 분해한다
정규화의 성능저하
정규화 전에는 데이터 조회 시 테이블 1개를 조인하고 조회 했다면
정규화 후에는 데이터 조회 시 테이블 2개를 조인해야 한다.
이는 조인 시 마다 CPU와 메모리 소모를 유발 시키기 때문에 성능 저하를 시킨다.
❗️해결방법은 반정규화를 하여 1개의 테이블에 저장하여 조인 시키는 것이다.
하지만, 하나의 테이블에 컬럼을 증가시키면 조인의 최소화로 조회가 빠르지만 너무 많아져 DBMS의 입출력 단위인 블록의 크기를 넘는다 그러면 1번 조회 할 때마다 여러개의 컬럼을 읽어야 하기 때문에 빠르진 않다.
03. 반정규화
정규화로 인한 DB 성능 저하를 막고자 데이터 중복을 허용하고 조인 횟수를 줄이는 방법
반정규화 특징
- 반정규화 시 테이블 조회가 간단하다
- 조인을 조회해서 조인을 제거함으로써 성능을 향상시킨다
- 데이터 중복을 허용하기 위해 조회(SELECT)문에서 조인(JOIN)을 제거한다 → 조회 속도 향상
- 데이터 독립성이 낮아진다
반정규화 수행하는경우
- 정규화 시 수행 속도가 느려졌을 경우
- 다량의 범위를 자주 처리해야 하는 경우
- 특정 범위의 데이터만 자주 처리하는 경우
- 요약/집계 정보가 자주 요구되는 경우
반정규화 절차
① 반정규화 대상 조사
모든 데이터양을 조사 후 범위 처리 빈도, 통계 프로세스, 테이블 조인 수, 대량 범위 처리 등을 통해 반정규화 대상을 검토한다
② 다른 방법 검토
다른 방법이 있는지 검토한다
e.g. 뷰(VIEW), 클러스터링, 인덱스 조정, 파티셔닝 기법, 응용 애플리케이션에서 로직을 구사하는 방법을 변경
③ 반정규화 실행
반정규화를 하는 대상은 테이블, 속성, 관계에 대해 적용하며 필요 시 추가, 분할, 제거 할 수 있다
반정규화 기법
테이블의 반정규화
기법분류 | 반정규화 기법 | 설명 |
테이블 병합 | 1:1 관계 테이블 병합 | 하나의 테이블로 병합 후 성능 향상 |
1:M 관계 테이블 병합 | 테이블을 병합 후 성능 향상 (but, 데이터 중복이 많다) | |
슈퍼/서브타입 테이블 병합 | 테이블 통합하여 성능 향상 | |
테이블 분할 | 수직분할 | 1개의 테이블을 수직을 분할시켜 2개의 테이블로 만든다 컬럼 단위의 테이블을 1:1로 분리시켜 성능 향상 |
수평분할 | 1개의 테이블을 수평으로 분할 시켜 2개의 테이블로 만든다 로우 단위로 집중 발생되는 트랜잭션을 분석하여 로우 단위로 테이블을 쪼갬. 특정 값에 따라서 테이블을 분할 |
|
테이블추가 | 중복테이블 추가 | 테이블 구조 중복하여 원격 조인 제거 |
통계테이블추가 | 합계, 평균을 미리 계산하여 조회 시 성능 향상 | |
이력테이블 추가 | 마스터 테이블에 존재하는 레코드를 중복하여 이력 테이블 존재 | |
부분테이블 추가 | 자주 사용하는 컬럼들 모아 테이블 생성 |
슈퍼 타입 / 서브 타입 ❓
주문 엔터티가 있다면 주문 엔터티는 의류 주문이나 신발 주문으로 분류 될 수 있다.
이 때, 주문 엔터티는 슈퍼 타입. 의류 주문이나 신발 주문은 서브 타입이라고 한다.
슈퍼/서브 타입 변환 방법
1. OneToOne Type (1:1 타입)
슈퍼 타입과 서브 타입을 개별 테이블로 도출 → 테이블 수가 많기 때문에 조인 증가, 관리 힘듦
2. Plus Type(슈퍼 + 서브 타입)
슈퍼 타입과 서브 타입 2개의 테이블 도출 → 조인 발생, 관리 힘듦
3. Single Type(All in One 타입)
슈퍼 타입과 서브 타입을 하나의 테이블로 도출 → 조인 감소, 관리 편리, 입출력 성능 나쁨
칼럼의 반정규화
반정규화 기법 |
중복칼럼 추가 |
파생칼럼 추가 |
이력테이블 칼럼 추가 |
PK에 의한 칼럼추가 |
응용시스템 오작동을 위한 칼럼 추가 |
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] SQL 기본 - 관계형 데이터베이스 개요 (0) | 2023.08.30 |
---|---|
[SQLD] 데이터 모델과 성능 - 대용량 데이터에 따른 성능, DB 구조와 성능, 분산DB 데이터에 따른 성능 (0) | 2023.08.30 |
[SQLD] 데이터 모델링의 이해 - 식별자 (Identifiers) (0) | 2023.08.29 |
[SQLD] 데이터 모델링의 이해 - 엔터티(Entity), 속성(Attribute), 관계(Relationship) (0) | 2023.08.29 |
[SQLD] 데이터 모델링의 이해 - 데이터 모델의 이해 (1) | 2023.08.29 |