정규화(Normalization)란?
- 관계형 데이터베이스의 설계에서 중복을 제거하여 데이터 모델의 독립성을 확보하기 위한 방법
- 정규화를 수행하면 비즈니스에 변화가 발생해도 데이터 모델의 변경을 최소화할 수 있다.
- 정규화는 제1정규화부터 제5정규화까지 있지만, 실질적으로는 제3정규화까지만 수행한다.
정규화 수행 모델은 데이터를 입력/수정/삭제할 때 일반적으로 반정규화된 테이블에 비해 처리 성능이 향상된다.
단, 데이터를 조회할 때에는 처리 조건에 따라 조회 성능이 향상될 수도 있고 저하될 수도 있다.
따라서 데이터 모델링을 할 때 반정규화를 하면 조회의 성능이 무조건 향상된다고 생각할 수도 있는데, 이것은 올바르지 않은 인식이다. 정규화를 해야만 성능이 향상되는 경우가 아주 많이 나타나기 때문이다.
정규화 절차
정규화 절차 | 설명 |
제1정규화 | 속성(Attribute)의 원자성(중복 값 제거)을 확보하고 기본키(Primary)를 설정한다. |
제2정규화 | 기본키가 2개 이상의 속성으로 이루어진 경우, 부분 함수 종속성을 제거(분해)한다. 부분 함수 종속성이란, 기본키가 2개 이상의 칼럼으로 이루어진 경우 |
제3정규화 | 기본키를 제외한 칼럼간의 종속성. 즉, 이행 함수 종속성을 제거한다. 이행 함수 종속성이란, 기본키를 제외하고 칼럼간에 종속성이 발생하는 것 |
BCNF | 기본키를 제외하고 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해한다. 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키이면 BCNF에 속함 |
제4정규화 | 여러 칼럼들이 하나의 칼럼을 종속시키는 경우 분해하여 다중값 종속성을 제거한다. |
제5정규화 | 조인에 의해서 종속성이 발생되는 경우 분해한다. |
[1] 제 1정규화
테이블의 칼럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것
왼쪽 테이블 같은 경우 김영희와 김미영은 여러 개의 취미를 가지고 있어서 원자성을 만족할 수 없기 때문에
이를 제 1정규화화여 오른쪽 테이블과 같이 원자값을 갖도록 테이블을 분해한 것이다.
[2] 제 2정규화
제 1정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것
위의 수강강좌 테이블에서는 기본키가 학생번호, 강좌이름으로 복합키이다.
그리고 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다.
(강좌이름이 바뀌면 강의실도 따라서 바뀌게 됨. 강좌이름이 강의실을 함수적으로 종속하고 있는 것)
바로 이러한 경우를 부분 함수 종속성이라고 하기 때문에 부분 함수 종속성이 발생하면 분해를 해야 한다.
결국 기본키의 부분키인 강좌이름이 결정자이기 때문에 아래의 테이블처럼 강의실을 분해하여 별도의 테이블로 관리하여 제 2정규형을 만족할 수 있다.
[3] 제 3정규화
제 3정규화에서는 이행 함수 종속성을 제거한다.
이행 함수 종속성이란, 기본키를 제외하고 칼럼간의 종속성이 발생하는 것이다.
이행 함수 종속성을 제거하는 이유는
예를 들어 수강 테이블과 수강료 테이블이 합쳐져 있다면 501번 학생이 수강하는 강좌 이름이 바뀔 때 강좌 이름만 바뀔 뿐, 수강료는 바뀌지 않는다.
따라서 강좌 이름에 맞게 수강료를 다시 변경해야 하는 번거로움을 해결하기 위해 제 3정규화를 하는 것이다.
[4] BCNF(Boyce-Codd Normal Form)
제 3정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것
위와 같은 테이블에서 기본키는 학생번호, 특강이름으로 지정할 수 있는데,
교수는 특강이름을 결정할 수 있는 권한을 가지고 있다.
이럴 때 교수가 결정자이고 후보키(최소성과 유일성)이기 때문에 특강 이름을 종속하기 때문에 분해가 일어난다.
따라서 기본키를 교수로 하고 칼럼을 특강 이름으로 하는 테이블을 새롭게 만들어야 한다.
정규화의 문제점
정규화는 위에서 말했듯이 데이터 조회(SELECT)시에 조인(JOIN)을 유발하기 때문에 CPU와 메모리를 많이 사용한다.
SELECT 사원번호, 부서코드, 부서명, 이름, 전화번호, 주소
FROM 직원, 부서
WHERE 직원.부서코드 = 부서.부서코드;
직원과 부서 테이블에서 부서코드가 같은 것을 찾는 것인데 이것을 프로그램화한다면 중첩된 루프를 사용해야 한다.
결과적으로 이러한 구조는 데이터양이 증가하면 비교해야 하는 건수도 증가한다.
하지만 이런 문제점을 해결하기 위해 반정규화를 하여 하나의 테이블에 저장한다면 성능 저하는 해결될 것이다.
이런 성능 저하를 해결하기 위해 반정규화가 있는 것이다.
반정규화(De-Normalization)
반정규화(De-Normalization)란?
- 데이터베이스의 성능 향상을 위해 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 기법
- 반정규화는 조회(SELECT) 속도를 향상하지만, 데이터 모델의 유연성은 낮아진다.
반정규화 절차
반정규화 절차 | 설명 |
대상 조사 및 검토 | 데이터 처리 범위, 통계성 등을 확인해서 반정규화 대상을 조사 |
다른 방법 검토 | 반정규화를 수행하기 전에 다른 방법이 있는지 검토 EX) 클러스터링, 뷰, 인덱스, 튜닝, 응용 프로그램, 파티션 |
반정규화 수행 | 테이블, 속성, 관계 등을 반정규화 |
반정규화 기법
[1] 계산된 컬럼 추가
- 배치 프로그램으로 총판매액, 평균잔고, 계좌평가 등을 미리 계산하고, 그 결과를 특정 칼럼에 추가한다.
[2] 테이블 수직 분할
- 하나의 테이블의 두 개 이상의 테이블로 분할한다. 즉, 칼럼을 분할하여 새로운 테이블을 만드는 것이다.
[3] 테이블 수평 분할
- 하나의 테이블에 있는 값을 기준으로 테이블을 분할하는 방법이다.
[4] 테이블 병합
- 1:1 관계의 테이블을 하나의 테이블로 병합해서 성능을 향상시킨다.
- 1:N 관계의 테이블을 병합하여 성능을 향상시킨다. 하지만 많은 양의 데이터 중복이 발생한다.
- 슈퍼 타입과 서브 타입 관계가 발생하면 테이블을 통합하여 성능을 향상시킨다.
Super Type과 Sub Type
예를 들어 고객 엔터티는 개인고객과 법인고객으로 분류되는데, 이때 고객 엔터티는 슈퍼 타입이고 개인고객과 법인고객은 서브 타입이 된다.
즉, 부모와 자식 관계가 나타난다.
슈퍼 타입 및 서브 타입 변환 방법
'SQL' 카테고리의 다른 글
DDL(Data Definition Language) (0) | 2023.07.24 |
---|---|
데이터 모델링(Data Modeling) (0) | 2023.07.11 |
관계형 데이터베이스 (0) | 2023.07.08 |
SQL이란? (0) | 2023.07.07 |