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

데이터베이스 정규화

by KDGdev 2023. 2. 1.

데이터베이스 정규화


데이터베이스 정규화란 관계형 데이터베이스에서 중복된 데이터를 최소화하는 과정입니다.

 

중복된 데이터로 인해 생기는 문제를 해결할 수 있으며, 정규화된 정도를 정규형으로 표현합니다.

 

제1 정규형

릴레이션의 모든 레코드에서 각각의 필드에는 한 개의 값만 들어가 있어야 하는 것입니다.

 

학생 과목
john 수학, 영어
jake 수학

학생과 듣는 수업에 대한 릴레이션입니다. 해당 릴레이션의 첫 번째 레코드의 과목 필드에는 두 개의 값이 들어가 있기 때문에 제1 정규형이 아닙니다.

이를 제1 정규형에 맞게 정규화하면 다음과 같습니다.

 

학생 과목
john 수학
john 영어
jake 수학

레코드가 늘어나 DB의 저장공간을 더 차지하였으나 이는 정규화를 위해 감안하는 부분입니다.

 

제2 정규형

릴레이션이 제1 정규형을 만족하며 기본키(복합키)의 일부 속성에 의존하고 있지 않고 기본키에 완전 함수 종속적인 것입니다.

 

학생 교수 과목
john james 수학
john mike 영어
john kevin 영어
jake james 수학

수업(과목)과 수강생(학생), 교수에 대한 릴레이션입니다. 해당 릴레이션에서 학생만으로는 기본키가 되지 못하고 학생과 교수에 따라 레코드를 구별할 수 있으므로 학생+교수인 복합키가 기본키입니다.

여기서 과목은 기본키의 일부 속성인 교수에만 의존하므로 제2 정규형이 아닙니다. ※교수는 한 과목만 맡는다고 가정합니다.

이 경우 학생 - 교수, 교수 - 과목으로 나눕니다.

 

학생 교수
john james
john mike
john kevin
jake james
교수 과목
james 수학
mike 영어
kevin 영어

위의 릴레이션을 제2 정규형으로 정규화시킨 결과입니다.

 

제3 정규형

릴레이션이 제2 정규형을 만족하며 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 것입니다.

이행적 함수 종속이란 A, B, C가 존재할 때 A -> B이고 B -> C이면 A -> C가 성립하는데 이때, C는 A의 이행적으로 함수 종속이 되었다고 합니다. 

 

회원 등급 할인율
john 플래티넘 20%
jake 골드 15%
kevin 실버 10%

회원과 등급, 그에 따른 할인율에 대한 릴레이션입니다. 해당 릴레이션에서 기본키는 회원이고 회원에 따라 등급이 결정되므로 회원 -> 등급, 등급에 따라 할인율이 결정되므로 등급 -> 할인율이 됩니다.

즉, 기본키가 아닌 할인율이 회원에 이행적 함수종속을 만족하므로 제3 정규형이 아닙니다.

 

이 경우 회원 - 등급, 등급 - 할인율로 나누어 제3 정규형으로 만듭니다.

 

회원 등급
john 플래티넘
jake 골드
kevin 실버
등급 과목
플래티넘 20%
골드 15%
실버 10%

위의 릴레이션을 제3 정규형으로 정규화시킨 결과입니다.

 

보이스/코드 정규형

제3 정규형을 만족하면서 모든 결정자가 후보키인 것입니다.

결정자란 특정 속성을 결정짓는 요소, 주민번호와 이름에서 이름은 주민번호를 결정짓지 못하지만 주민번호는 이름을 결정지을 수 있기 때문에 주민번호는 결정자라 할 수 있습니다.

 

학생 과목 교수
john 수학 james
john 영어 mike
john 영어2 mike
jake 수학 james

제2 정규형을 설명할 때와 마찬가지로 수업(과목)과 수강생(학생), 교수에 대한 릴레이션입니다. 

또한 제2 정규형을 설명할 때와 반대로 교수가 여러 과목을 맡을 수 있다고 가정하였고, 때문에 이 경우 기본키는 학생+과목인 복합키입니다.

여기서 기본키가 아닌 교수가 과목을 결정하기 때문에 보이스/코드 정규형을 만족하지 않습니다.

 

학생 - 과목, 과목 - 교수로 나누어 이를 해결합니다.

 

학생 과목
john 수학
john 영어
john 영어2
jake 수학
교수 과목
james 수학
mike 영어
mike 영어2
james 수학

위의 릴레이션을 보이스/코드 정규형으로 정규화시킨 결과입니다.

 

정규형을 지키지 않을 시 발생하는 이상현상

  • 삽입이상
    • 과목을 수강하지 않은 학생 정보를 추가할 때 과목에 null값을 넣어야 합니다.
  • 수정이상
    • 학생의 다른 정보를 갱신했을 때, 다른 곳에 있는 해당 학생의 정보도 알맞게 갱신해야 합니다. 이를 놓칠 시, 학생의 데이터가 일치하지 않는 데이터 부정합이 일어납니다.
  • 삭제이상
    • 어떤 학생이 한 과목 만을 듣고 있고 그 과목을 취소한다면 그 학생에 대한 정보가 아예 사라집니다.

 

마무리

간단한 예시를 들어 설명하여 릴레이션이 분리되는 방식이 다 비슷합니다. 실제상황에서 쓰이는 바는 이보다 좀 더 다르기 때문에 위의 예시들에서는 각각의 정규형이 왜 릴레이션을 분리하는지에 대해 생각하시면 이해하는데 도움이 될 것 같습니다.

 

※ 잘못된 정보, 혹은 다른 의견이 있다면 댓글로 말해주세요. 감사합니다.

 

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

인덱스의 정의  (0) 2023.02.27
NoSQL(비관계형) 데이터베이스  (0) 2023.02.17
관계형 데이터베이스  (0) 2023.02.14
트랜잭션  (0) 2023.02.08
데이터베이스 기초  (1) 2023.01.27