Jasontreks Blog

DM 보내기


Send

정규화

데이터베이스를 조작할 때, 잘못 설계된 테이블로 인해 이상현상이 발생할 수 있다. 이상현상은 삽입, 삭제, 수정 등의 과정에서 발생할 수 있으며, 이를 방지하기 위해 정규화라는 작업을 필요로 한다.


I. 이상현상

이상현상은 조작 작업에 따라 테이블의 일관성을 훼손하여 데이터 무결성을 깨드리는 현상이다. 이상현상은 다음 세가지로 나뉜다.

  • 삽입 이상: 부득이한 NULL 입력, 중복 데이터 삽입
  • 삭제 이상: 삭제 시 필요한 데이터가 함께 연쇄삭제
  • 수정 이상: 수정 시 테이블의 속성 간 일관성이 깨짐

II. 함수 종속성

정규화를 위해 테이블을 분석해 기본키와 함수 종속성을 파악할 필요가 있다.

  • 결정자: 다른 어떤 개념을 결정하는 역할
  • 종속자: 결정자에 의해 결정되는 역할

예를 들어 한 테이블에 학과와 학과 사무실 속성이 있다면 학과 정보가 학과 사무실 정보를 결정한다고 할 수 있다. 이때 종속성은 학과 -> 학과 사무실 로 표기한다. A -> B 에서 A는 결정자, B는 종속자 라고 한다.

함수 종속성 규칙

  • 부분집합 규칙: (학과, 주소) -> 학과
  • 증가 규칙: 학생번호 -> 학생이름 ==> (학생번호, 강좌이름) -> (학생이름, 강좌이름)
  • 이행 규칙: 학생번호 -> 학과, 학과 -> 학과사무실 ==> 학생번호 -> 학과사무실
  • 결합 규칙: 학생번호 -> 학생이름, 학생번호 -> 주소 ==> 학생번호 -> (학생이름, 주소)
  • 분해 규칙: 학생번호 -> (학생이름, 주소) ==> 학생번호 -> 학생이름, 학생번호 -> 주소
  • 유사이행 규칙: 학생이름 -> 학생번호, (강좌이름, 학생번호) -> 성적 ==> (강좌이름, 학생이름) -> 성적

기본키 찾기

테이블에서 함수 종속성을 찾아내면 기본키를 정할 수 있다. 기본키는 정규화의 결정적인 단서가 되므로 중요하다. 예를 들어 학생(이름, 학과, 주소, 학점) 테이블이 있다고 가정하면 논리적으로 보았을 때 이름 속성이 나머지 세 속성을 결정한다고 볼 수 있다. 따라서 이름 속성이 테이블 전체를 결정하는 결정자라고 볼 수 있으며 이때 이름은 기본키 속성이 된다.

이상현상과 결정자

이상현상은 하나의 릴레이션에 두개 이상의 정보가 포함되어 있을 때 나타난다. 정확이 말하자면, 키본키가 아니면서 결정자인 속성이 있을 때 나타난다. 이를 해결하는 방법은 릴레이션 분리이다.

릴레이션 분리 예시

학생(이름, 학과, 주소, 강좌이름, 강의실)

이 경우 강좌이름이 강의실의 결정자이므로 이상현상이 발생할 수 있다. 따라서 다음과 같이 강좌 릴레이션으로 분리할 수 있다.

-> 학생(이름, 학과, 주소, 강좌이름) -> 강좌(강좌이름, 강의실)


III. 정규화

정규화는 릴레이션을 분리하여 이상현상을 없애는 작업이다. 정규화가 진행된 단계를 제1 정규형 ~ 제4 정규형으로 구분한다. 정규형 등급이 높을수록 이상현상이 발생하지 않는다.

제1 정규형

모든 속성값이 원자값을 가지면 제1 정규형이다.

제1 정규형이 아닌 릴레이션은 다음과 같다.

이름취미
김연아인터넷
추신수영화, 음악
박세리음악, 쇼핑
김연경음악

원자값을 갖도록 릴레이션을 수정하면 다음과 같다.

이름취미
김연아인터넷
추신수영화
추신수음악
박세리음악
박세리쇼핑
김연경음악

제2 정규형

릴레이션이 제1 정규형을 만족하며, 기본키가 아닌 속성이 기본키에 완전 종속일 때 제2 정규형이다. 예를 들어 다음과 같은 릴레이션이 있다고 해보자.

학생번호강좌이름강의실성적
501데이터베이스110호3.5
401데이터베이스110호4.0
402스포츠경영학103호3.5

이 릴레이션의 기본키는 (학생번호, 강좌이름)이다. 하지만 강의실 속성의 경우 학생번호가 없어도 강좌 이름에 종속적이다. 즉 이는 기본키가 아닌 속성이 기본키에 완전 종속이 아닌, 불완전 종속인것이다. 이는 이상현상을 유발한다.

따라서 이 릴레이션을 다음과 같이 분해할 수 있다.

학생번호강좌이름성적
501데이터베이스3.5
401데이터베이스4.0
402스포츠경영학3.5
강좌이름강의실
데이터베이스110호
데이터베이스110호
스포츠경영학103호

이렇게 하면 제 2정규형을 만족하게 된다.

제3 정규형

릴레이션이 제2 정규형을 만족하며, 기본키가 아닌 속성들이 이행적으로 종속하지 않으면 제3 정규형이다.

예를 들어 다음과 같은 릴레이션이 있다고 해보자.

학생번호강좌이름수강료
401데이터베이스20000
402스포츠경영학15000
502자료구조25000

이 릴레이션에선 강좌 이름이 학생 번호에 종속되고, 수강료는 강좌 이름에 종속된다. 즉 학생번호 -> 강좌이름 -> 수강료

따라서 이 릴레이션을 다음과 같이 분리하여 정규화한다.

학생번호강좌이름
401데이터베이스
402스포츠경영학
502자료구조
강좌이름수강료
데이터베이스20000
스포츠경영학15000
자료구조25000

BCNF

제3 정규형을 보완해 모든 결정자가 후보키가 되도록 릴레이션을 분해한 것이다.

무손실 분해

분해한 릴레이션을 다시 공통된 속성으로 조인할 때, 분해 전의 릴레이션과 같으면 무손실 분해를 만족한다.