database/SQLD

[SQLD] 정규화(Normalization)

sewonzzang123 2022. 2. 11.
반응형

 

 

2022.02.11 - [database] - [SQLD] 식별자

 

[SQLD] 식별자

2022.02.02 - [database] - [SQLD] 엔터티(Entity), 속성(Attribute), 관계(Relation) [SQLD] 엔터티(Entity), 속성(Attribute), 관계(Relation) 이전 글 : https://sewonzzang.tistory.com/41 [Database] 데이터..

sewonzzang.tistory.com


데이터 모델링 수행 절차

1. 데이터모델링을 할 때 정규화를 정확하게 수행한다.

2. 데이터베이스 용량산정을 수행한다.

3. 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.

4. 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.

5. 이력모델의 조정, PK/FK조정, 슈퍼타입/서브타입 조정 등을 수행한다.

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

 

정규화(Normalization) 이란?

정규화의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.

이러한 테이블을 분해하는 정규화 단계가 정의되어 있는데, 여기서 테이블을 어떻게 분해되는지에 따라 정규화 단계가 달라지는데, 각각의 정규화 단계에 대해 자세히 알아보자.

 

 

제1 정규화 

테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다. 

왼쪽 테이블과 같은 고객 취미 테이블이 존재한다고 하면, 김영희와 김미영은 여러 개의 취미를 가지고 있기 때문에 제1 정규형을 만족하지 못하고 있다. 그렇기 때문에 이를 제1 정규화하여 분해할 수 있다. 제1 정규화를 진행한 테이블은 오른쪽과 같다.

 

제2 정규화

제2 정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 여기서 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어서는 안된다는 것을 의미한다.

위의 수강강좌 테이블에서는 기본키가 (학생이름, 강좌이름)으로 복합키 이다. 그리고 (학생번호, 강좌이름)인 기본키는 성적을 결정하고 있다.

여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다. (강좌이름) -> (강의실)

즉 기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에 아래의 테이블처럼 강의실을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족할 수 있다.

 

제3 정규화

제3 정규화는 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 

이행적 종속은 A->B, B->C가 성립할 때 A->C가 성립되는 것을 의미한다.

이행적 종속을 제거하는 이유는 다음과 같다.

예를 들어 수강과 수강료 테이블이 합쳐져 있다면, 501번 학생이 수강하는 강좌 이름이 바뀔 때 해당 강좌 이름만 바뀔 뿐, 수강료는 바뀌지 않는다. 물론 강좌 이름에 맞게 수강료를 다시 변경할 수 있지만, 번거로움을 해결하기 위해 제3 정규화를 하는 것이다.

 

 

BCNF 정규화

제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.

학생번호, 특강이름, 교수로 구성된 테이블이 존재한다고 하면,

기본키는 (학생번호, 특강이름) 이 되는데, 교수가 특강이름을 결정할 수 있다.

이럴 때는 교수가 특강이름을 결정하는 결정자지만, 후보키가 아니라는 점이다. 그렇기 때문에 이 테이블을 (학생번호, 특강이름) 테이블과 (특강이름, 교수)로 분해할 수 있다.

반응형

댓글