[데이터 모델과 성능]정규화(Normalization)

yellong·2020년 5월 28일
0

SQLD

목록 보기
18/27
post-thumbnail

정규화란?

  • 정규화는 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 방법이며 데이터를 분해하는 과정이다.
  • 정규화된 모델은 테이블이 분해된다. 테이블이 분해되면 직원 테이블과 부서 테이블 간에 부서코드로 조인(Join)을 수해앟여 하나의 합집합으로 만들 수도 있다.
  • 정규화를 수행하면 불필요한 데이터를 입력하지 않아도 되기 때문에 중복 데이터가 제거된다.

정규화 절차

정규화 절차설명
제1정규화- 속성(Attribute)의 원자성을 확보한다.
- 속성의 중복값을 제거한다.
- 기본키(Primary)를 설정한다.
제2정규화- 기본키가 2개 이상의 속성으로 이루어진 경우, 부분 함수 종속성을 제거(분해)한다.
- 부분 함수 종속성이란, 기본키가 2개 이상인 칼럼으로 이루어진 경우에반 발생한다. 기본키가 1개이면 이 과정을 스킵한다.
- 복합 인스턴스에 대해 각 인스턴스의 종속적 중복을 삭제한다.
제3정규화- 기본키를 제외한 칼럼 간에 종속성을 제거한다.
- 즉, 이행 함수 종속성을 제거한다.
- 일반 속성의 종속성을 제거한다.
BCNF- 기본키를 제외하고 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해한다.
- BCNF는 복수의 후보키가 있고, 후보키들이 복합 속성이어야 하며, 서로 중첩되어야 한다.
제4정규화여러 칼럼들이 하나의 칼럼을 종속시키는 경우, 분해하여 다중값 종속성을 제거한다.
- 다치 종속성을 제거한다.
제5정규화조인에 의해서 종속성이 발생되는 경우 분해한다.

정규화의 문제점

  • 정규화는 데이터 조회(SELECT) 시에 조인(Join)을 유발하기 때문에 CPU와 메모리를 많이 사용한다.
  • 아래 코드를 프로그램화한다면 중첩된 루프(Nested Loop)를 사용해야 한다.
[ANSI Join]
SELECT 사원번호, 부서코드, 부서명, 이름, 전화번호, 주소 
FROM 직원, 부서
WHERE 직원.부서코드 = 부서.부서코드;
==>
SELECT 사원번호, 부서코드, 부서명, 이름, 전화번호, 주소
FROM 직원 INNER JOIN 부서 ON 
직원.부서코드=부서.부서코드;

정규화를 사용한 성능 튜닝

  • 조인으로 인하여 성능이 저하되는 문제를 반정규화로 해결할 수 있다.
  • 반정규화는 데이터를 중복시키기 때문에 또 다른 문제점을 발생시킨다.

0개의 댓글