본문 바로가기
CS/데이터베이스

[DB] 데이터베이스 정규화 개념정리

by 젊은오리 2022. 4. 30.
728x90

정규화(Normalization)란?

 

관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 한다.

중복된 데이터를 없앰으로써 무결성을 유지할 수 있으며, 이상현상(Anomaly)을 방지할 수 있다.

이상현상에는 다음 3가지가 있다.

  • 삽입 이상(Insertion Anomaly): 새로운 데이터를 하나 삽입할 때, 테이블의 필요하지 않은 필드들 때문에 원치 않는 필드의 값도 삽입해야 하는 경우에 데이터의 불일치가 발생한다.
  • 갱신 이상(Modification Anomaly): 중복된 데이터 중에 일부를 갱신 할 시 데이터의 불일치가 발생한다.
  • 삭제 이상(Deletion Anomaly): 데이터를 삭제할 때 의도치 않은 데이터까지 삭제되서 데이터의 불일치가 발생한다.

 

데이터베이스의 table을 어떻게 분해하는지에 따라 정규화 단계가 달라지는데, 다음 사진과 같이 나눠진다.

 

 

제 1정규화

→ 테이블의 모든 속성값이 원자값(한개의 값)으로 이루어져야 한다. 

즉, 다음 테이블에서 추신수와 박세리의 취미를 보면 값이 2개로 이루어져 있는데, 이를 하나로 나눠줘야 한다. 

 

제 2정규화

→ 제 1정규화를 마친 테이블에 대해서 완전함수종속을 만족해야 한다.

즉, 기본키의 부분집합이 다른 속성의 결정자가 되서는 안된다는 뜻이다.

[수강강좌]테이블을 보면 학생번호와 강좌이름이 같이 기본키를 이루고 있다. 이 말은, 학생번호와 강좌이름이 다른 속성들을(강의실, 성적) 모두 결정해야 한다는 뜻이 된다. 

 

하지만 강의실의 경우 기본키중에서도 강좌이름이 결정할 수 있는 속성이다. 따라서 밑에 그림과 같이 {강좌이름 -> 강의실}을 따로 만들어주는 편이 낫다.

 

 

 

제 3정규화

→ 제 2정규화를 마친 테이블에 대해서 이행함수종속을 없애야 한다.

즉, 논리적으로 A->B, B->C 일때 A->C를 만족하는데, 이러한 이행적인 종속들을 제거해야된다는 뜻이다! 

밑의 [계절학기]테이블에서 학생번호는 강좌이름을 결정하고 있고, 강좌이름은 수강료를 결정하고 있다. 따라서 학생번호가 수강료를 결정하고 있다는 아이러니한 결과가 나오는데, 학생번호가 수강료를 결정하는 것은 말이 안되기 때문에 제거해야 한다.

 

따라서 다음과 같이 [계절학기]테이블을 [계절수강],[수강료] 두개의 테이블로 나누어서 이행적 종속을 막은 모습을 볼 수 있다.

 

 

 

BCNF정규화

후보키가 여러개인 경우에는 3NF를 만족시키지만 이상현상이 발생하는 경우가 있는데, 이를 해결하기 위한 정규형이 보이스-코드 정규화(BCNF)이다. 제3정규화보다 더 엄격한 제약조건을 가지기 때문에 Strong 3NF 라고도 한다.

→ 제 3정규화를 마친 테이블에 대해서 모든 결정자가 후보키 집합에 속해야 한다.

아래 [특강수강]테이블에서 {학생번호, 특강이름}은 기본키로서 교수를 결정한다. 근데 교수 또한 특강이름을 결정하는 결정자가 된다. 이때, 결정자가 후보키로 취급되고 있지 않기 때문에 이상현상(Anomaly)이 발생한다. 

 

따라서 그림과 같이 [특강신청]테이블과 교수를 후보키로 하는 [특강교수]로 나누어 BCNF정규화를 만족할 수 있다.

 

사진출처 https://chokyuhwan.tistory.com/27   https://hongcoding.tistory.com/147

728x90

'CS > 데이터베이스' 카테고리의 다른 글

[DB] 데이터베이스 트랜잭션 정리  (0) 2022.05.01

댓글