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

[데이터베이스] 데이터베이스 정규화 - Database Normalization

by 뜨는 해 2020. 9. 19.

 

 

프로젝트의 데이터를 저장하기 위해 관계형 데이터베이스를 설계해야 할 때면 항상 나오는 정규화(Normalization).

 

정규화를 왜 해야하는 지는 위키백과를 보면 알 수 있다.


관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다. 데이터베이스 정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것에 있다.

 

정규화의 의의는 데이터의 불필요한 중복을 없애고, 잘 조직된 관계를 구성하는 데에 있다.

 

정규화의 단계는 1NF, 2NF, 3NF, BCNF, 4NF, 5NF.. 등등이 있으며, 숫자가 올라갈 수록 잘 정규화 되었다고 볼 수 있다.

 

 

1NF - First Normal Form


정규화 전
정규화 후

 

제 1 정규화는 이러한 규칙을 따른다.

 

각 row마다 col이 하나씩만 있어야 한다. STUD_PHONE에서 2개 이상의 데이터가 포함되어 있다.

아래처럼 모든 데이터가 1개씩만 있으며, 이를 원자 값이라고 한다.

 

제 1 정규화는 이러한 원자 값들로만 이루어져 있다.

 

제 1정규화 만으로는 불필요한 데이터 중복을 방지 할 수 없다. 또한

 

삽입 이상 : 기본키로 구성할 속성에 NULL 값 출현.

갱신 이상 : 중복되는 튜플이 생겨, 같은 투플에서 정보가 달라지는 문제가 발생할 수 있다. -> 데이터 불일치

삭제 이상 : 어떤 투플을 삭제하는 순간, 꼭 필요한 데이터를 같이 삭제할 수 밖에 없다.

 

 

2NF - Second Normal Form


제 2 정규화의 만족 조건은 이렇다.

 

  • 제 1 정규형을 만족 시켜야 한다.
  • 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형에 속한다.

 

1NF에서 부분 함수 종속을 제거하고 모든 속성이 기본키에 완전 함수 종속 되도록 만들어야 한다.

 

사진에서 보다시피, Module 속성을 이용해 Dept와 Lecture, 그리고 Text를 분리해 데이터 중복을 없앨 수 있다.

Module과 Depth로 Lecture을 구분 할 수 있고, Module을 통해 Text를 구분할 수 있게 되었다.

 

이러한 2NF에서도 문제가 있다, 살펴보자면

 

삽입 이상 : 예를 들어 현재 Dept에는 없는 (D3, L5)를 넣고 싶다고 치자.

새로운 Dept인 D3가 생겼지만, D3를 만족하는 Module이 없이는 이 정보를 넣을 수 없다.

 

2NF

 

갱신 이상 : 우승자와 생년 월일이 중복되고 있다. 조심하지 않는다면 우승자가 각기 다른 생년월일을 가질 수 있다.

모든 2NF가 갱신 이상을 가지는 것은 아니다.

 

삭제 이상 : 만약 어떤 우승자를 삭제한다고 한다면, 대회나 연도까지 삭제되어야만 한다.

 

 

3NF - Third Normal Form


제 3정규형까지 만족할 경우, 이 데이터베이스는 정규화 되었다고 말 할 수 있다.

 

제 3 정규화의 만족 조건은

 

  • 릴레이션이 제 2 정규형에 속해야 한다.
  • 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제 3 정규형에 속한다.

출처 : https://m.blog.naver.com/PostView.nhn?blogId=k97b1114&logNo=140148913593&proxyReferer=https:%2F%2Fwww.google.com%2F

 

이행적 함수 종속이란, 그림에서 볼 수 있듯이, 학번 -> 지도교수 -> 학과를 통해 학번으로 학과를 알 수가 있다.

또한 학번 -> 학과로 다이렉트로 학과를 알 수 있다.

 

이러한 상황을 이행적 함수 종속이라고 한다.


이외에도 BCNF, 4NF, 5NF 등이 있지만, 정말 필요하지 않은 경우, BCNF 이상으로 가지 않는다고 생각한다.

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

[데이터베이스] 키의 속성과 개념  (0) 2020.09.17