[SQL] 데이터 모델과 성능, 정규화, 반정규화

김죠·2023년 12월 28일
0
post-thumbnail

1. 성능 데이터 모델링과 정규화

1.1 성능 데이터 모델링

  • 데이터베이스는 우리가 생각하는 것보다 훨씬 더 많은 요청을 처리함. 매우 빠른 템포로 자주 발생하는 쿼리문이 비효율적이면 DB 전체 성능에 영향을 줄 수 있음
  • 테이블 설계 자체가 잘못되는 경우, 테이블 내 원하는 정보가 없어 다른 테이블에서 정보 가져와야 하는 경우 등 다양한 성능 향상 저해 요소 존재
  • 이러한 성능 저해를 막고 처음부터 성능 향상을 목적으로 진행하는 것이 성능 데이터 모델링
  • 데이터 모델링 때부터 정규화, 반정규화, 테이블 통합/분할, 조인, PK/FK 등 여러 사항이 반영되도록 정의

1.2 성능 데이터 모델링 수행시점

  • 프로젝트 수행 중보다는 사전에 철저하게 설계한 후 도입할수록 비용 적게 듦
  • 분석/설계 단계에서 진행할 경우 성능 저하로 인해 발생하는 재업무 비용 최소화할 수 있음

1.3 성능 데이터 모델링의 고려사항

  1. 정규화를 정확하게 수행하여 중복 데이터 쌓이는 것 방지하기
  2. 데이터베이스 용량 산정 수행을 통한 데이터 집중되는 테이블 파악하기
  3. 데이터베이스에서 발생되는 트랜잭션 유형 파악하여 데이터 조회에 필요한 조인 관계 파악하기
  4. 데이터베이스의 용량과 트랜잭션 유형에 따라 반정규화 수행하기
  5. 이력 모델, PK/FK, 슈퍼 타입/ 서브 타입 조정을 통해 성능 우수한 순서대로 컬럼 순서 조정하기
  6. 성능 관점에서 데이터 모델 검증하기

2. 정규화

  • 데이터의 일관성을 유지하고 데이터의 중복을 방지하며 데이터의 유연성을 유지하기 위해 데이터를 분해하는 과정
  • 데이터를 삽입/수정/제거를 통해 중복된 요소를 줄일 경우 성능 향상
  • 데이터를 조회할 경우 테이블 간 조인 작업 등이 일어나 오히려 성능이 하락할 수 있음

2.1 정규화 용어

용어설명
정규화(Normalization)DBMS 테이블의 삽입/삭제/수정 과정에서의 이상(Anomaly) 현상의 발생 최소화하기 위해 작은 단위의 테이블로 나누는 과정
정규형(NF: Normal Form)데이터 모델이 갖춰야 할 특성을 만족하는 정규화된 결과물
함수적 종속성(FD: Functional Dependency)테이블의 특정한 칼럼 값(A)을 알고 있으면 다른 칼럼 값(B)을 알 수 있다고 가정할 때, 칼럼 B는 칼럼 A에 함수 종속성을 갖는다고 표현
결정자(Determinant)함수적 종속성에서 학번은 학생 이름을 결정짓는 요소기 때문에 '결정자'라고 표현
다치 종속(MVD: MultiValued Dependency)결정자 칼럼 A에 의해 칼럼 B의 값을 다수 알 수 있을 때, 칼럼 B는 칼럼 A에 다치종속 되었다고 표현

2.2 정규화의 이점

  1. 데이터의 유연성 : 종속성 강한 데이터를 독립된 개념으로 분리하여 정의하므로 높은 응집도와 낮은 결합도 원칙에 충실해짐
  2. 데이터의 재활용성 : 정규화를 통해 데이터의 개념을 조금 더 세분화 가능하고 그 결과로 개념 재활용 가능성 증가
  3. 데이터의 중복 최소화 : 정규화는 식별자가 아닌 속성이 한번만 포함되므로 데이터 중복 최소화

2.3 정규화 단계(제 1,2,3 정규화)

제1정규화

  • 한 속성에 여러 개의 속성이 포함되어 있거나 같은 유형의 속성이 여러 개로 나뉘어 있는 경우 함수 종속성을 근거로 해당 속성 분리

예시)

  • 이름, 출생지, 주소는 주민등록번호에 대해 함수 종속성을 가짐
    => 이름,출생지,주소 : 종속자 / 주민등록번호 : 결정자

제1정규화 위반 예시

  • 연락처 컬럼에 핸드폰 번호, 이메일 주소의 두개의 속성이 포함되어 있음 => 따로 분리

  • 기존의 연락처 속성을 제거한 후 연락처 유형을 구분하는 연락처 구분(핸드폰/이메일) 컬럼을 생성한 후 그에 따른 연락처 컬럼을 새로 생성
  • 이를 통해 하나의 컬럼이 하나의 속성값을 가지므로 제1정규형 만족

제2정규화

제1정규화 + PK가 아닌 모든 칼럼은 PK 전체에 종속

제2정규화 위반 예시

  • 이수민의 고객 등급이 "다이아몬드"로 변경된다면 기존 세 주문 일자의 고객 등급을 모두 다이아몬드로 변경해주어야 함(갱신 이상 발생 가능) => 분리


  • 테이블을 분리하여 고객 정보를 위한 식별자를 추가하여 문제 해결
  • 테이블 2개로 분리한 후 고객 정보는 고객 아이디 식별자에 종속될 수 있도록 구성하여 복합 식별자의 일부 칼럼에만 종속되는 문제 해결하여 제2정규형 만족

제3정규화

제2정규화 + 일반 속성 간 함수 종속 관계 존재하지 않아야 함

  • 위 테이블의 경우 직업 코드에 직업 이름 속성이 종속되는 관계
  • 기본키인 고객 아이디를 제외한 일반 속성 간 함수 종속 관계 존재 => 제3정규화 위반 => 분리

2.4 정규화 유형


3. 반정규화

  • '반'의 의미는 '절반'이 아닌 '반대'의 의미
  • 정규화와 동일하게 '성능 향상'이라는 목적을 가지나, 데이터의 중복을 통해 목적 달성에서 정규화와 다름

3.1 반정규화를 적용해야 하는 상황

  1. 데이터 조회 시 디스크 I/O량이 많아 성능 저하되는 경우
  2. 테이블 간 경로가 멀어 조인으로 인한 성능 저하 예상되는 경우
  3. 컬럼 계산하여 읽을 때 성능 저하될 것으로 예상하는 경우

3.2 반정규화 절차

  • 반정규화는 반드시 적용해야 하는 요소는 아님
  • 반전규화 수행시 중복이 많이 발생해 영향을 받는 요소들이 많으므로 반정규화 대상을 먼저 조사 후 다른 방법 먼저 찾아보고 적용

3.3 반정규화 기법

  1. 테이블의 반정규화 -> 테이블 병합, 테이블 분할, 테이블 추가
  • 테이블 병합
  • 테이블 분할
  • 테이블 추가
  1. 컬럼 반정규화 -> 중복/파생/이력 테이블 컬럼 추가, PK에 의한 컬럼 추가, 응용 시스템 오작동 위한 컬럼 추가

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

profile
1=850

0개의 댓글