데이터베이스 정규화

TPark·2020년 4월 15일
0

백엔드

목록 보기
3/8

정규화란?

관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 한다.

제 1 정규화

  1. 각 로우마다 컬럼의 값이 1개만 존재해야함.
    ex) 한 회원의 전화번호 칼럼에 여러개의 전화번호가 존재할수 없음.

    회원ID이름전화번호
    1김모씨010-7605-1003,010-3105-1111
    2박모씨010-1234-1233
  2. 반복되는 그룹 속성이 존재할 수 없음. 여기서 반복되는 그룹속성이란 같은 성격과 내용의 칼럼이 연속으로 나타나는 것을 말함.
    ex) 회원정보 테이블의 전화번호1, 전화번호2 속성

    회원ID이름전화번호1전화번호2
    1김모씨010-7605-1003010-3105-1111
    2박모씨010-1234-1233null

    이를 해결하기 위해서는 회원정보 테이블과 전화번호 테이블을 따로 분리해야한다.

제 2 정규화

  1. 모든 칼럼이 완전 함수적 종속이 되어야 한다
  2. 함수적 종속이란 X의 값에 따라 Y의 값이 변경될때, Y는 X에 대해 함수적으로 종속되었다고 한다. X -> Y
  3. 부분 함수적 종속이란 (X1,X2) -> Y에서 두 키중 하나만 Y의 값을 결정할때, 이를 부분 함수적 종속이라고 한다.
  • ex) 아래와 같은 상세주문 테이블이 있다고 가정해보자.
상품id주문id상품명
12아메리카노
11아메리카노

여기서 상품명은 상품id와 주문id 중 주문id에만 종속되기 때문에 완전 함수정 종속이 되어야한다는 조건을 위배한다. 따라서 상품테이블과 주문테이블을 분리해야 한다.

제 3 정규화

  1. 기본키가 아닌 모든 속성은 기본키에만 의존해야 한다
  2. 이행적 함수 종속관계를 갖는 컬럼을 제거하는 과정
  • ex) 아래는 제 3정규화가 필요한 예이다.
토너먼트연도우승자우승자 생년월일
서울코딩대회2012아무개920515
부산코딩대회2013김모씨970103
경주코딩대회2014김수로021104

여기서 후보키를 토너먼트와 연도라고 했을때 우승자 생년월일은 두키 중 어디에서 의존하지 않는다. 따라서, 토너먼트 테이블과 우승자 테이블을 따로 분리해야 한다.

BCNF

제 3 정규화를 만족하지만, 키값이 칼럼에 의해 결정지어질때

  • ex)
학생과목교수
1cmsc131Mr. Herald
2cmsc131Mr. Herald
3engl101Ms. Kim

예시에서 후보키는 학생과 과목이다. 이때 Mr. Herald 교수가 과목명을 cmsc131에서 cmsc132로 바꾼다면 두 로우를 변경해야한다. 이처럼 과목명이 교수에 의해 결정되기 때문에, 이는 BCNF의 조건을 위배한다.
따라서, 학생 + 과목 테이블과 교수 + 과목 테이블로 테이블을 분리해야한다.

역정규화

  • 시스템 성능을 고려하여 기졲 설계를 재구성하는 것
  • 정규화에 위배되는 행위
  • 물리적 모델링 단계에서 데이터 사용량 분석과 업무 프로세스 분석을 통해 보다 효율적인 DB를 구축할 수 있도록, 상황에 따라 수행한다
  • index, trigger, 역정규화

역정규화 방법

  • 데이터 중복(컬럼 역정규화)
    - 조인 프로세스가 많아 시스템의 성능저하를 가져오는 경우, 조인 프로세스를 줄이기 위해 해당 컬럼을 중복 사용함으로써 성능을 향상
  • 파생컬럼의 생성
    - 테이블에 없는 컬럼을 숫자 연산이나 데이터 조작 등을 통해 조회할때 때 새로운 정보를 보여주는 경우
    - ex) 성적 테이블의 총점, 평균 칼럼
  • 테이블 분리
    - 컬럼 기준으로 분리(컬럼수)
    - 레코드 기준으로 분리(레코드 양)
  • 요약 테이블 생성(Summary Table)
    - 조회의 프로세스를 줄이기 위해 요약된 정보만을 저장하는 테이블을 만드는 것
  • 테이블 통합
    - 분리된 두 테이블이 시스템 성능에 영향을 끼칠 경우 고려

0개의 댓글