[ SQLD 1일차 ] 데이터 모델과 성능 : 정규화와 함수적 종속성 ( 제 1정규화, 제 2정규화, 제 3정규화, BCNF ) , 반정규화

junjun·2023년 9월 1일
0

SQLD

목록 보기
1/2

정규화와 성능

: 성능 데이터 모델링의 개념
-> 분석/설계 단계부터 데이터베이스 성능을 고려한 데이터 모델링을 수행하는 기법이다.

-> SQL이 아닌 데이터 모델을 중심으로 성능에 대한 데이터 모델링을 수행한다.

분석/설계 -> 구현 -> 테스트 -> 운영
단계로 시간이 지남에 따라 성능개선 비용이 증가한다.

(2) 성능 데이터 모델링의 절차

: 논리 모델링 단계에서는 데이터베이스 정규화를 수행한다.

: 물리 모델링 단계에서는
용량산정과 트랜잭션 유형 파악을 통해 반정규화를 수행하고, 이력 유형, PK/FK 순서, 슈퍼 타입/서브 타입을 통해 데이터 구조를 조정한다.

[ 성능 데이터 모델링의 절차 ]

  1. 정규화 ( 논리적 데이터 모델링 )
    -> 데이터 중복을 제거해서, 데이터 처리 성능을 향상시킨다.

  2. 용량 산정
    -> 데이터베이스의 현재 용량과 예상 증가량을 조사한다.

  3. 트랜잭션 유형 파악
    -> 데이터의 분할 및 조인 여부를 조사한다.

  4. 반정규화
    -> 테이블, 컬럼, 관계에 대해 반정규화를 수행한다.

  5. 데이터 구조 조정
    -> 이력 유형, PK/FK 순서, 슈퍼 타입/서브 타입 조정

  6. 데이터 모델 검증
    -> 성능 관점에서 데이터 모델을 검증한다.


데이터베이스 정규화

(1) 개념

: 관계형 데이터 모델에서 데이터의 중복성을 제거하여,
이상 현상(anomaly)을 방지하고, 데이터의 일관성을 유지하기 위해 무손실 분해 하는 과정이다.

이상 현상 : 릴레이션을 조작할 때, 데이터가 불필요하게 중복되어 일관성이 유지되지 못하는 현상을 의미한다.

: 함수적 종속성(Functionality Dependency)의 성질을 이용해서 데이터베이스 정규화를 수행한다.

(2) 함수적 종속성(Functionality Dependency)

: 함수적 종속성은 데이터가 가지고 있는 속성 간의 관계에 의해 결정되고 종속되는 현상이다.

: 데이터의 기준 값을 결정자(Determinant)라고 하고, 종속되는 값을 종속자(Dependent)라고 한다.

함수적 종속성의 표현
(결정자) -> (종속자)
ex. (주민등록번호) -> (이름, 나이)


[ 함수적 종속성의 유형 ]

(1) 부분 함수 종속성
: 복합식별자의 부분적인 속성이 일반 속성을 결정하는 상태

ex.
(학생, 과목) -> 담당교수 이면서
(과목) -> 담당교수 가 성립하는 경우
: 복합식별자의 부분적인 속성인 '과목'이 일반 속성 '담당교수'를 결정함.

(2) 완전 함수 종속성
: 식별자의 전체 속성이 일반 속성을 결정하는 상태

(1)번의 예시처럼,
(학생, 과목) 이 전체 속성이 (담당교수) 속성을 결정하는 경우, '담당교수' 속성은 (학생, 과목)에 완전히 함수적으로 종속한다. 라고 표현한다.

(3) 이행 함수 종속성
: 식별자가 아닌 일반 속성이 다른 일반 속성을 결정하는 상태

(학생, 학과, 등록금) 릴레이션이 있다고 가정한다.
이 릴레이션에서 결정자 : 학생 이고
학과, 등록금이 일반속성일 때
학생 -> 학과 로 학생은 학과를 결정하지만,
학생 -> 등록금 이 성립하진 않는다.
오히려, 학과 -> 등록금 이 성립하는,
결정자에게 종속적인 일반 속성이 다른 일반 속성을 결정한다.이를 이행적인 함수 종속성이 있다고 표현한다.

(4) 결정자 함수 종속성
: 후보키가 아닌 결정자가 존재하는 상태

(학번, 과목, 교수) 릴레이션이 있다고 가정한다.
여기서 (학번, 과목) -> (교수) 가 성립한다.
또한, 일반 속성인 (교수) -> (과목) 이 성립한다.
즉, 일반 속성이 복합식별자의 부분 속성인 (과목)을 결정한다.


[ 데이터베이스 정규화 단계 ]

일반적으로 데이터베이스 정규화는
함수적 종속성에 근거해서 수행한다.

(1) 1차 정규화
: 테이블 내의 속성값을 원자값으로 구성하는 단계

(2) 2차 정규화
: 부분 함수 종속성을 제거하는 단계

(3) 3차 정규화
: 이행적 함수 종속성을 제거하는 단계

(4) BCNF ( Boyce-Codd Normal Form )
: 결정자 함수 종속성을 제거하는 단계

[ 정규화의 성능 고려사항 ]

: 정규화를 하면 데이터 처리 조건에 따라 성능이 향상될 수도 있지만 반대로 성능이 저하될 수도 있다.

: 정규화로 인해 조인이 증가하는 경우에는, 데이터 조회 성능이 저하될 수도 있다.

: 데이터 조회와 입력/수정/삭제의 성능이 Trade-Off 되어 발생하기도 한다.

BUT) 정규화를 진행하면, 데이터의 무결성을 보장하기 쉬워진다.
동일한 내용의 속성이 여러 릴레이션에 중복되어 있으면
데이터를 삽입/수정/삭제할 때 이상 현상이 생기거나,
무결성을 지키기 위한 추가 작업들이 생길 수 있기 때문이다.

조회 ( SELECT)

: 단일 테이블 조회 시, 데이터 중복이 제거되어 조회 성능이 향상된다.

: 다수의 테이블을 조인하여 조회하는 경우에는, I/O 증가와 조인 연산으로 조회 성능이 저하되기도 한다.

입력, 수정, 삭제

: 데이터 중복이 제거되어, 일반적으로 성능이 향상된다.


반정규화 ( De - Normalization )

: 반정규화는 시스템의 성능 향상, 개발 및 운영의 단순화를 위해 정규화된 데이터 모델을 중복, 통합, 분리하는 데이터 모델링 기법이다.

: 역정규화 또는 비정규화로 부르기도 한다.

< 반정규화 절차 >
: 대상을 조사하고, 다른 방법을 먼저 유도한 후 반정규화를 수행한다.

: 반정규화는 데이터의 일관성(무결성)을 유지하는 비용이 더 발생하기 때문에,
반정규화를 수행하기 전에 대안을 검토하는 작업을 선행한다.


< 반정규화 절차 >

(1) 반정규화 대상조사

: 범위 처리 빈도수 조사
-> 일정한 범위를 조회하는 프로세스가 많은지 확인한다.

: 대량의 범위처리 조사
-> 대량의 데이터 범위를 자주 처리하는지 확인한다.

: 통계성 프로세스 조사
-> 통계 정보를 필요로 하는 프로세스가 있는지 확인한다.

: 테이블 조인 개수 조사
-> 테이블에 조인의 개수가 많은지 확인한다.

(2) 다른 방법을 유도

: 뷰(View) 테이블 생성
-> 성능을 고려한 뷰를 생성한다.

: 클러스터링 적용
-> 클러스터링 팩터에 의해 저장방식을 다르게 적용한다.

: 인덱스의 조정
-> 인덱스 변경 및 생성

: 애플리케이션 로직 변경
-> 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상한다.

(3) 반정규화 적용

: 테이블 반정규화
-> 테이블 병합, 분할, 추가

: 칼럼 반정규화
-> 중복 컬럼, 파생 컬럼, 이력 컬럼 추가

: 관계 반정규화
-> 중복관계 추가

반정규화 기법

: 테이블 반정규화, 칼럼 반정규화, 관계 반정규화가 있다.

[ 테이블 반정규화 ]

(1) 테이블 병합

1:1 관계, 1:M 관계, 슈퍼/서브 타입 테이블 병합

1:1 관계의 테이블 병합 시, 데이터의 중복이 발생 X

1:M 관계의 테이블 병합 시, 참여도가 1인 테이블에서 데이터 중복이 발생한다.

슈퍼/서브 타입 병합 시, 슈퍼 타입과 서브 타입을 하나의 테이블로 병합한다.

(2) 테이블 분할

: 테이블을 수직 또는 수평으로 분할한다.

-> 수평 분할 : 행을 기준으로 테이블을 분할

-> 수직 분할 : 컬럼을 기준으로 테이블을 분할

테이블에서 특정 컬럼만 조회할 때, Disk I/O 를 맞추기 위해 수직 분할을 이용한다.

(3) 테이블 추가

: 중복, 통계(집계), 이력, 부분 테이블 추가

-> 중복 테이블 추가
: 원격 환경에서 테이블 구조를 중복으로 구성
: DB Link 제거

[ DB Link ]

  • 현재의 데이터베이스에서 다른 데이터베이스에 접속하기 위한 객체이다.
  • DB Link를 통해 서로 다른 데이터베이스 간의 원격 조인이 가능하다.

-> 통계(집계) 테이블 추가
: 대량의 데이터를 GROUP BY, SUM과 같은 함수로 요약해서 저장한다.

-> 이력 테이블 추가
: 이력 관리용 테이블을 추가한다.

-> 부분 테이블 추가
: Disk I/O를 줄이기 위해 자주 사용되는 칼럼에 대해 새로운 테이블로 추가한다.

칼럼 반정규화

-> 중복 컬럼 추가
: 조인을 감소시키기 위해 다수 테이블에 중복된 컬럼을 추가한다.

-> 파생 컬럼 추가
: 계산에 의한 성능 부하를 예방하기 위해 미리 값을 계산한 칼럼을 추가한다.

-> 이력 컬럼 추가
: 이력 데이터에서 최근 값을 조회하기 위한 기능성 컬럼을 추가한다.

-> 임시 컬럼 추가
: 애플리케이션 오작동 시 이전 데이터로 복구하기 위한 임시 컬럼을 추가한다.

-> 기본키(PK)에 의한 컬럼 추가
: 단일속성인 PK가 복합 의미를 갖는 경우에 개별 의미를 일반 속성에 포함한다.

관계 반정규화

-> 중복관계 추가
: 여러 경로를 거쳐야 조인이 가능한 경우, 추가적인 관계를 생성해서 성능을 향상한다.

[ 반정규화의 성능 고려사항 ]

: 중복성의 원리를 이용해서 데이터 조회 성능을 향상시키는 역할을 한다.

: 데이터를 조회할 때, Disk I/O 양이 많아서 반정규화를 수행해서 성능을 향상시킨다.

: 정규화로 인해 엔티티가 증가하고 조인의 개수가 많아지는 경우에 반정규화를 고려한다.

profile
새로운 것을 배우고, 기존의 것에 깊이를 더하는 걸 좋아합니다.

0개의 댓글