본문 바로가기

DB

정규화

정규화에 대해서 공부하기에 앞서 우리는 정규화를 왜 할까?

 

다음과 같은 특정 학생이 수강한 과목에 대해 테이블이 있다고 하자

이름 번호 과목명 과목번호
철수 1 수학 2
훈이 2 수학 2
철수 1 영어 1
짱구 3 수학 2
맹구 4 국어 3

이렇게 본다면 중복되는 데이터들이 있다. 철수와 철수의 번호에 대해서는 2번 중복이 되고, 수학과목은 3번 영어과목은 2번 중복이 된다. 이렇든 하나의 릴레이션에 여러 앤티티의 속성이 들어가게 된다면 데이터의 중복이 일어나게 된다. 

이렇게 되면 저장 공간도 낭비이고, 갱신 이상도 발생할 가능성이 있다.

 

갱신이상은 다음과 같이 이루어져 있다.

  • 삽입이상
    불필요한 정보를 함께 저장하지 않고는 저장이 불가능한 것을 말한다. 예를들어 위의 릴레이션에서 수강신청을 하지 않았고, 번호가 5인 유리를 삽입한다고 가정해보자, 그렇다면 과목명과 과목번호가 비어있어 데이터 삽입이 안된다. 이를 삽입이상이라고 한다.
  • 삭제이상
    삭제를 할때 원하는 데이터 뿐만 아니라 다른 데이터도 함께 삭제해야 삭제가 되는것을 말한다. 예를들어 위의 릴레이션에서 짱구라는 데이터를 삭제하고 싶은데 옆에 있는 수강정보까지 함께 삭제해야 삭제가 되는것을 의미한다.
  • 수정이상
    어떠한 값을 수정했을때 그 속성의 다른 속성값들은 수정이 안되는 상황을 말한다. 예를들어 위의 릴레이션에서 철수의 번호를 6으로 수정한다고 했을때 첫번재 행과 세번째 행 모두 수정이 되어야 하는데 하나만 수정이 되는 경우를 예로 들 수 있다.

이러한 이상현상을 겪지 않고 데이터 중복을 최소화 하기위해 데이터를 구조화 하는 작업을 정규화라고 한다.

 

정규화가 진행되면 기존 릴레이션이 분해되며 분해된 릴레이션들은 무손실 조인을 보장해야 한다.

 

정규화의 종류

제1 정규화

제1 정규화란 테이블의 컬럼이 원자값을 갖게 하는것을 말한다. 다음의 테이블을 예로 들어보겠다.

이를 제1 정규화를 하면 다음과 같이 변한다

제2정규화

제 2정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 말이 어려우니 실제 예시를 보자

여기서 기본키는 (학생번호,강좌이름) 복합키이다. 그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다. 따라서 제 2정규화를 하면은 다음과 같이 테이블이 나오게 된다.

 

제3정규화

제 3정규화란 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 여기서 이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.

위와 같은 테이블에서 학생 번호는 강좌 이름을 결정하고 있고, 강좌 이름은 수강료를 결정하고 있다. 따라서 제3 정규화를 한다면 다음과 같다.

BCNF정규화

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

이게 무슨 말인지 다음의 예시를 통해 이해해보도록 하자

기본키는 (학생번호, 특강이름)이다. 그리고 기본키 (학생번호, 특강이름)는 교수를 결정하고 있다. 또한 여기서 교수는 특강이름을 결정하고 있다. 교수가 특강이름을 결정하는 결정자이지만, 후보키는 아니다. 따라서 BCNF 정규화를 한다면 다음과 같이 분해할 수 있다.

위와 같이 정규화의 종류와 정규화를 하는 이유에 대해서 알아봤다. 데이터베이스 설계, 운영 과정에 맞게 정규화 과정을 따르면 될것이다.