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

[데이터베이스] 정규화(Normalization)

by 박연호의 개발 블로그 2020. 8. 31.

이번 시간에는 데이터베이스 정규화에 대해 공부해 보겠습니다.

 

정규화란 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 의미합니다. 또한 데이터베이스 이상현상을 없애고 크고, 제대로 조직되지 않은 테이블들과 관계들을 작고 잘 조족된 테이블과 관계들로 나눈것을 포함합니다. 쉽게 말해서 데이터 중복 의한 이상현상을 해소하는 과정을 의미합니다.

 

 

정규화에는 1정규형(1NF), 2정규형(2NF), 3정규형(3NF), BCNF(Boyce-Codd Normal Form), 4정규형(4NF), 5정규화(5NF)가 주로 실무에서 사용되며 그 이외의 경우는 주로 연구용으로 사용됩니다.


1 정규형(1NF) : 모든 속성을 반드시 하나의 원자값만 가져야 한다

위의 경우 취미는 반복그룹(취미1,취미2,취미3)을 가지거나, 다중값(축구,게임,독서)를 가지는데, 이는 1정규형을 위배합니다. 이 경우 취미 테이블을 새로 만들어 학생 테이블과 취미 테이블간에 1:N관계를 만들어 주어야 합니다.


2 정규형(2NF) : 부분적 함수종속 제거, 모든 속성은 반드시 모든 기본키에 종속되어야 한다(기본키 일부에만 종속되면 안됨)

점수 테이블의 기본키는 강의번호, 학번 입니다. 우리가 박연호의 데이터베이스 강의 점수를 알기 위해서는 데이터베이스 강의번호로만 박연호의 점수를 찾을 수 없습니다(사실 전체를 뽑아놓고 박연호 이름을 찾으면 찾을 수 있겠지만...).점수 테이블에서 '강의번호 + 학번'을 통해서만 박연호의 점수를 알 수 있겠죠. 

 

이를 '점수' 속성은 기본키(강의번호 + 학번)에 종속적이다 라고 말합니다. 하지만 이름의 경우는 기본키에 종속적이지 않습니다. 단지 '학번'으로만으로도 이름을 알 수 있기 때문이죠. 이는 2정규형을 위반합니다. 

 

또한 점수테이블에 여러 조작을 할 경우 이상현상이 발생할 수 있습니다.

만약 새로운 학생을 추가할 경우 강의번호, 점수에는 null값을 넣어야 합니다 ㅡ> 입력이상

'AC1103' 강의를 삭제할 경우 박연호 학생까지 삭제 됩니다 ㅡ> 삭제이상

 

이런 경우 학생 정보를 관리하는 테이블을 새로 만들어 주어서 점수 테이블이 학생 테이블을 참조할 수 있게 만들어 주어야 합니다.


3 정규형(3NF) : 이행적 함수종속 제거, 기본키가 아닌 모든 속성간에는 서로 종속될 수 없다

학생 테이블의 기본키는 학번입니다. 하지만 학과 속성의 경우 학과번호에 종속됩니다. 이처럼 기본키가 아닌 속성들간에는 서로 종속관계가 될 수 없습니다. 이 경우 학과테이블을 따로 만들어 학생 테이블에서 학과 테이블을 참조하도록 만들어야 합니다.

 


BCNF : 기본키가 아닌 속성이 기본키의 속성을 결정지을 수 없다.

BCNF는 3정규형 보다 강한 정규형 입니다. 먼저 "교수는 하나의 강의만 담당할 수 있다" 라는 사전조건이 들어가야 합니다. 이런 경우 단지 "교수"의 이름 만으로도 강의(기본키 속성)을 결정지을 수 있습니다. 이는 "교수는 하나의 강의만 담당한다"라는 조건이 들어가 있기 때문입니다. 이런 경우 아래와 같이 테이블을 분할해 주어야 합니다.