CS/데이터베이스

[Database] 정규화란? (1NF, 2NF, 3NF, BCNF,4NF, 5NF)

대기업 가고 싶은 공돌이 2024. 8. 16. 18:06

정규화 (Nomalization)

정규화의 목표는 테이블 간에 중복된 테이터를 허용하지 않게 만드는 것이다.

 

중복된 데이터를 허용하지 않음으로서 무결성, 일관성, 유연성을 향상 시킬 수 있고,

DB의 저장 용량도 줄일 수 있다.

 

이러한 정규화는 단계가 정해져 있다. 하나씩 살펴보도록 하자.

 

제 1정규화

제 1정규화란 테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것이다.

 

예를 들어 밑과 같은 테이블이 존재한다고 했을 때,

출처 : https://mangkyu.tistory.com/110

위의 취미들 컬럼은 원자성을 만족하지 못한다.

복합 속성일 경우, 데이터의 검색 및 조작이 어려워지고, 중복 데이터가 증가할 확률이 높아진다.

따라서 제 1정규화를 통해 원자성을 만족시키도록 해야한다.

제 2정규화

제2 정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.

 

완전 함수 종속이란?

기본키의 부분집합이 결정자가 되지 않는 것을 완전 함수 종속이라 한다.

 

예를 들어 아래의 테이블을 살펴보자.

 

출처: https://mangkyu.tistory.com/110

위의 테이블에서 기본키가 (학생 번호, 강좌 이름) 두 개로 이뤄진 복합키라고 했을 때,

 

강좌 이름이라는 PK의 부분 집합이 강의실을 결정하는 강의실의 PK가 될 수 있다.

 

이러한 경우 강좌 이름과 강의실을 다른 테이블로 만들면, 강좌 이름과 강의실의 중복 데이터를 제거할 수 있다.

출처: https://mangkyu.tistory.com/110

이렇게 강좌 이름과 강의실 컬럼을 다른 테이블로 만들어 제2 정규형을 만족시킬 수 있다.

 

제 3정규화

제3 정규화란 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다.

 

이행적 종속이란?

A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.

 

예를 들어, 

출처: https://mangkyu.tistory.com/110

위와 같은 테이블이 존재할 때, 

학생 번호가 강좌 이름을 결정하고, 강좌 이름은 수강료를 결정한다. 

 

이 상황에서 501 학생이 강좌를 데이터베이스 -> 운영체제로 바꿨다고 할 때

 

강좌명만 변경하는 것이 아닌 수강료도 같이 변경해줘야 하는 불편함을 겪는다.

 

이러한 불편함을 해결하기 위해, 학생 번호와 강좌 이름으로 이뤄진 테이블 하나,
강좌 이름과 수강료로 이뤄진 테이블을 하나 만들어 제3 정규화를 진행하는 것이다.

 

출처 : https://mangkyu.tistory.com/110

일반적으로 제3 정규화까지만 진행하고 이 이상은 진행하지 않는다.

 

그 이유는 정규화가 너무 많이 진행될 경우 

 

  1. 엔터티가 증가한다.
  2. 엔터티 사이의 관계가 증가한다.
  3. 데이터 조회시 조인이 늘어나, 조회 성능이 하락한다.

등의 문제가 발생하기에 보통 제3 정규형까지만 진행한다.

 

그래도 나머지 정규화도 모두 살펴보도록 하자.

 

BCNF 정규화

BCNF 정규화란 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.

 

예를 들어,

출처: https://mangkyu.tistory.com/110

위의 테이블에서 기본키는 (학생번호, 특강이름)이다.

학생 번호, 특강 이름은 교수를 결정한다.

그러나 교수는 특강 이름을 결정한다. 특강 이름을 결정하는 결정자 이지만 유일성을 만족하지 못하기에,
후보키가 될 수 없다. 이 때문에 테이블을 분해하여, 교수 컬럼이 후보키가 될 수 있도록 해줘야 한다.

출처: https://mangkyu.tistory.com/110

제 4정규화

제 4정규화는 BCNF를 만족하는 테이블에 대해, 다치 종속을 제거하는 것이다.

 

다치 종속이란?

같은 테이블 내의 독립적인 두 개 이상의 컬럼이 또 다른 컬럼에 종속되는 것을 말한다.

A -> B인 의존성에서 단일 값 A와 다중 값 B가 존재한다면 다치 종속이라 한다.

이러한 종속을 A->>B로 표기한다.

 

다치 종속은 최소 2개의 컬럼이 다른 컬럼에 종속되어야 하기 때문에 최소 3개의 컬럼이 필요하다.

 

출처: https://velog.io/@wisdom-one/%EC%A0%95%EA%B7%9C%ED%99%94Normalization

위의 테이블은 개발자가 자격증을 결정하고, 동시에 언어도 결정한다.

 

이와 같은 경우 다치 종속을 만족하므로, 다치 종속을 없애기 위해 다음과 같이 테이블을 분리할 수 있다.

 

출처: https://velog.io/@wisdom-one/%EC%A0%95%EA%B7%9C%ED%99%94Normalization

 

제 5정규화

제 5정규화는 4정규형을 만족하는 테이블에 대해 조인 종속을 제거하는 것을 의미한다.

 

조인 종속이란?

 

하나의 릴레이션을 여러 개의 릴레이션으로 분해했다가, 다시 조인했을 때 데이터 손실이
없고, 필요없는 데이터가 생기는 것을 말한다. 조인 종속성은 다치 종속의 개념을 더 일반화 한 것이다.

 

출처: https://velog.io/@wisdom-one/%EC%A0%95%EA%B7%9C%ED%99%94Normalization

이 예제를 조인 시켜보면,

이와같은 결과가 나온다. 

 

조인 이후 필요없는 데이터가 생겨난 것을 확인할 수 있다.

 

이러한 조인 종속을 제거하기 위해 테이블을 다음과 같이 분리할 수 있다.

출처: https://velog.io/@wisdom-one/%EC%A0%95%EA%B7%9C%ED%99%94Normalization

 

 

참고 :