[데이터베이스] 정규화에 대해서 알아보자

2024. 12. 30. 16:05CS/Database

 

 

데이터베이스 정규화에는 여러 과정이 있지만,

오늘은 학부 수준에서 배운 제1 정규형부터 BCNF 형까지 정리해보려고 한다.

 

 

 정규화란?

 

데이터베이스를 설계하다 보면, 여러 이상현상들이 발생할 수 있다.

 

설계상 문제로 인해 데이터를 삽입할 때 불필요한 데이터를 같이 삽입해야 한다거나

혹은 중복된 튜플들이 있는 경우, 데이터를 변경하였을 때 일부만 변경되는 경우

혹은 설계상 문제로 인해 데이터 삭제 시 필요한 데이터도 같이 삭제되는 경우가 발생한다.

 

이러한 이상현상들이 발생하지 않도록 데이터베이스를 설계하는 과정을 의미한다.

 

 

✔  정규화?  정규형?

 

정규화에 대해 공부하면 등장하는 개념은 바로 정규형이다.

쉽게 말하면 정규화를 통해 나온 결과가 정규형이다.

 

제1정규화 후 -> 제1정규형

제2정규화 후 -> 제2 정규형

제3정규화 후 -> 제3 정규형

 

 

✔  결정자?  종속자?

 

   X   ->  Y   

 

정규화를 이해하려면 함수종속관계에 대해 이해해야 한다.

먼저 결정자는 위에서 X에 해당하고 종속자는 Y에 해당한다.

 

이러한 관계에서

X는 Y를 결정하고 Y는 X에 종속되어 있다고 할 수 있다.

이 개념은 뒤에 정규화 과정에서 나오는 함수 종속성 제거를 이해하려면 알고 있어야 한다.

 


✔  제1 정규형 (1NF)

 

제1 정규형은 하나만 기억하면 된다.

릴레이션 테이블의 모든 속성 도메인이 원자값으로 이루어진 경우를 말한다

 

이름 나이 동아리
홍길동 25 프로그래밍동아리, 데이터베이스동아리

 

❌  이런 게 아니라

 

이름 나이 동아리
홍길동 25 프로그래밍동아리
홍길동 25 데이터베이스동아리

 

⭕ 이렇게 되어 있어야 한다.

 


✔  제2 정규형 (2NF)

 

제2 정규형은 제1 정규형을 만족하면서 기본키 이외의 모든 속성들이 기본키에 완전함수종속 되어야 한다.

완전함수종속 되어야 한다는 것은 즉 제1 정규형에서 부분함수종속을 제거해야 한다는 의미다.

 

 

위 릴레이션을 예시로 설명해 보면

(학번, 과목번호) -> 성적 관계이고

과목번호 -> 담당교수 관계에 있음을 알 수 있다.

 

즉 한 릴레이션 테이블에 학번, 과목번호, 담당교수, 성적 속성이 있다고 하면

담당교수의 경우 과목번호에 의해 결정되는 속성이므로 굳이 한 릴레이션 테이블에 저장할 필요가 없다.

이러한 상태를 부분함수종속이라고 한다.

이를 해결하면 완전함수 종속이다.

 

따라서 릴레이션 테이블을 (학번, 과목번호, 성적)와 (과목번호, 담당교수) 릴레이션으로 분리하여

두 개를 만들면 완전함수종속 상태가 된다.

 


✔  제3 정규형 (3NF)

 

제3 정규형은 제2 정규형을 만족하면서 이행함수종속을 제거해야 한다.

 

 

여기서 보면 (과목번호, 담당교수, 메일주소) 속성들로 이루어진 릴레이션 테이블이 있다.

이때 함수종속관계를 살펴보면

 

과목번호 -> 담당교수

담당교수 -> 메일주소

과목번호 -> 메일주소

 

의 관계가 성립한다. 

즉 논리학?으로 비유해 보면 A는 B다 B는 C다 따라서 A는 C다 관계와 비슷해 보인다.

 

이러한 관계를 이행함수종속 관계에 있다고 한다.

이를 분리하여 (과목번호, 담당교수)와 (담당교수, 메일주소) 릴레이션으로 분리하면 해결되고 제3 정규형을 만족한다.

 


 

✔  BCNF형 (보이스 코드 정규형)

 

마지막으로 살펴볼 정규형은 BCNF 형이다.

쉽게 말하면 모든 결정자가 후보키여야 한다.

 

위의 릴레이션은 (학번, 과목명, 담당교수) 속성으로 이루어져 있고

기본키 (학번, 과목명)가 담당교수를 결정한다.

그러나 담당교수가 과목명을 결정하는 것을 볼 수 있다.

 

담당교수는 기본키가 아니다. 그러나 담당교수는 후보키가 아니므로 문제가 발생함을 알 수 있다.

따라서 위의 릴레이션은 (학번, 담당교수)와 (담당교수, 과목명)으로 분해해야 한다.