프로젝트의 데이터를 저장하기 위해 관계형 데이터베이스를 설계해야 할 때면 항상 나오는 정규화(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가 갱신 이상을 가지는 것은 아니다.
삭제 이상 : 만약 어떤 우승자를 삭제한다고 한다면, 대회나 연도까지 삭제되어야만 한다.
3NF - Third Normal Form
제 3정규형까지 만족할 경우, 이 데이터베이스는 정규화 되었다고 말 할 수 있다.
제 3 정규화의 만족 조건은
- 릴레이션이 제 2 정규형에 속해야 한다.
- 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제 3 정규형에 속한다.
이행적 함수 종속이란, 그림에서 볼 수 있듯이, 학번 -> 지도교수 -> 학과를 통해 학번으로 학과를 알 수가 있다.
또한 학번 -> 학과로 다이렉트로 학과를 알 수 있다.
이러한 상황을 이행적 함수 종속이라고 한다.
이외에도 BCNF, 4NF, 5NF 등이 있지만, 정말 필요하지 않은 경우, BCNF 이상으로 가지 않는다고 생각한다.
'데이터베이스' 카테고리의 다른 글
[데이터베이스] 키의 속성과 개념 (0) | 2020.09.17 |
---|