[SQLD] 데이터 모델과 성능 - 성능 데이터 모델링, 정규화

박진우·2022년 5월 24일
0

SQLD

목록 보기
5/21

# 성능 데이터 모델링의 개요

💡 성능 데이터 모델링

DB 성능향상을 목적으로 설계단계의 데이터 모델링 때부터 정규화, 반정규화, 테이블통합, 테이블분할, 조인구조, PK, FK 등 여러 가지 성능과 관련된 사항이 데이터 모델링에 반영될 수 있도록 하는 것이다.

  • 데이터모델은 성능을 튜닝하면서 변경 될 수 있는 특징이 있다.

  • 데이터의 증가가 빠를수록, 성능저하에 따른 성능개선비용은 증가한다.

  • 분석/설계 단계에서 고려한 데이터 모델링을 수행할 경우 성능 저하에 따른 Rework 비용을 최소화 할 수 있는 기회를 갖게 된다.


◽ 성능을 고려한 데이터 모델링의 순서

  • 1) 데이터 모델링을 할 때 정규화를 정확하게 수행
  • 2) 데이터베이스 용량산정 수행
  • 3) 데이터베이스에 발생되는 트랜잭션 유형 파악
  • 4) 용량과 트랜잭션의 유형에 따라 반정규화 수행
  • 5) 이력모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 수행
  • 6) 성능관점에서 데이터 모델 검증


💡 정규화

정규화는 데이터의 일관성, 최소한의 데이터 중복, 최소한의 데이터 유연성을 위한 방법이며 데이터를 분해하는 과정.

◽ 정규화의 특징

  • 정규화된 모델은 테이블이 분해되고, 테이블이 분해되면 직원 테이블과 부서 테이블 간에 부서코드로 조인(join)을 수행하며 하나의 합집합으로 만들 수 있다.

  • 정규화를 하면 불필요한 데이터를 입력하지 않아도 되기 때문에 중복 데이터가 제거된다.

  • 모델의 독립성을 향상시킨다.

  • 테이블의 수가 증가한다.

  • 테이블의 수가 증가한다.

  • 업무가 변경되도 모델의 유연성을 향상 시킨다.

  • 찾아야할 데이터가 적어 쿼리가 더 빨라진다.


◽ 정규화 절차

제 1 정규화 제 2 정규화 제 3 정규화 BCNF 제 4 정규화 제 5 정규화
- 속성 원자성 확보(모든 도메인이 원자값)
- 기본키를 설정
- 기본키가
  속성 2개 이상
- 부분 함수
  종속성 제거
- 기본키 외 칼럼 간
  종속성 제거

- 이행 함수
  종속성 제거
후보키가 기본키를
종속시키면  분해함
- 하나의 칼람을 종속시키는 경우 분해하여 다중값 종속성 제거(다치종속 제거) 조인에 의해서
종속성 발생하면
분해함

함수적 종속성: 데이터들이 어떤 기준 값에 의해 항상 종속되는 현상

1차 정규화(1NF)

테이블의 중복을 제거한다 , 분리된 테이블을 만든다 , 분리된 테이블은 기본키로 식별한다.
즉 릴레이션의 모두 도메인이 원자값으로 구성된다.

2차 정규화(2NF)

부분함수 종속성을 제거한다 그러나, 제1정규화 결과 기본키가 하나라면 생략한다.

3차 정규화(3NF)


❗ 사원 이름은 직책에 대해 전이 함수 종속 이다 .

어떤 릴레이션이 2NF이고, 기본키에 속하지 않는 모든 속성이 기본키에 전이함수종속이 아니면 제 3정규형에 속한다.

❓ 전이함수종속(Transitive FD ; 이행함수종속)

  • 함수종속 관계에서 'A -> B 와 B -> C 가 성립하면 A -> C 가 성립한다.
    ==> 이때 속성 C는 속성 A에 '전이 함수 종속' 이라고 한다.

보이스/코드 정규형 (BCNF; Boyce/Codd Normal Form)

릴레이션의 모든 결정자가 후보키이면 그 릴레이션은 BCNF 정규형에 속한다.


제4정규형(4NF)

릴레이션에서 함수종속이 아닌 다치종속(MVD)을 제거한 경우이다.
-> 즉, BCNF에 속하고, 모든 다치종속이 함수종속이면 4NF에속한다.


제5정규형(5NF)

릴레이션에서 후보키를 통하지 않은 조인종속(JD)을 제거한 경우이다.
-> 즉, 4NF이고, 모든 조인종속이 릴레이션의 후보키에 의해서만 성립된다.

◽ 정규화의 문제점 및 해결방법

정규화의 문제점: 조인 & 성능저하 유발 정규화의 문제 해결 방법 반정규화의 문제점
- 데이터 조회 시 조인(Join)을 유발함
- CPU, 메모리를 많이 사용함
- 정규화는 조인을, 조인은 부하를 유발함


- (ex) "직원"과 "부서"테이블에서
           "부서코드"가 같은 행을 찾는 경우
- 중첩된 루프 = 이중 for문을 사용해야 함

- 데이터양 증가하면, 비교 건수도 증가함
- 인덱스, 옵티마이저를 통해 비효율 해결
- 조인에 의한 성능 저하를 해결하기 위해
  반정규화를 하여, 하나의 테이블에 저장

- 반정규화: 데이터 중복을 허용
- 칼럼이 계속 증가하여, 조인이 최소화됨
- 조인 감소하면, 조회 빠르게 할 수 있음
- 반정규화는 데이터를 중복시키므로
  또 다른 문제점을 발생시킴
- 너무 많은 칼럼이 추가되면,
  1개 행의 크기가 너무 커짐
- DB 관리시스템의 입출력 단위인
  블록 크기(Block Size) 를 초과함
- 1개 행을 읽기위해 여러 블록을 읽어야 함
  → 디스크 입출력 증가 → 성능 저하 유발

0개의 댓글