어 나 갱수.

[DB] 정규화란 ? 🐼 본문

DB

[DB] 정규화란 ? 🐼

김경수 2024. 2. 4. 21:43
728x90

정규화란 ?

정규화는 테이블 간에 중복된 데이터를 허용하지 않기 위해 정해놓은 정의 같은 것입니다. 중복된 데이터를 허용하지 않음으로써 무결성을 유지할 수 있으며, DB의 저장 공간 또한 줄일 수 있습니다.

결과적으로, 정규화를 하는 목적은 데이터들을 조금 더 효율적으로 관리하기 위함입니다.

정규화의 목적

  • 중복을 허용하지 않으며 삽입, 삭제, 갱신 이상의 발생을 감지한다.
  • 데이터를 삽입하거나 수정할 때 릴레이션의 재구성을 최소화하는 것을 목표로 하고 있다.
  • 각 릴레이션에 중복된 종속성을 여러 개의 릴레이션으로 분할한다.

정보의 중복

한 릴레이션에 여러 엔티티의 애트리뷰트들이 존재하면 정보가 중복 저장된다.

  • 저장 공간 낭비
  • 갱신 이상 발생

정규화 과정

정규화는 제1 정규화부터 제5 정규화까지 있지만, 실질적으로는 제3 정규화까지만 수행합니다.

 

제1 정규화 (1NF)

데이터베이스의 각 칼럼이 가지는 원자값(하나의 값)을 가지도록 하는 과정이다.

각 컬럼은 하나의 데이터만 저장되며, 다중 값을 저장하지 않는다.

 

예를 들어 아래와 같은 '수강신청' 테이블이 있다고 가정해 보겠습니다.

네트워크 과목은 김종한, 이현준 여러 수강자를 가지고 있기 때문에 제1 정규화를 만족하지 않고 있습니다.

 

이런 식으로 테이블을 설계하면 어떤 문제가 발생하나요?

  • 데이터의 중복이 발생한다.
  • 데이터의 이상현상이 발생할 수 있다.

발생할 수 있는 이상 현상

  • 갱신 이상
    • 이현준이 과목을 보안으로 바꾼다면 김종한이 듣고 있는 네트워크도 보안으로 바뀌게 된다.
  • 삭제 이상
    • 이현준이 네트워크 수강을 취소한다면 김종한의 네트워크 수강 정보도 삭제된다.

제1 정규화 적용 후

다음은 제1 정규화를 시킨 수강신청 테이블입니다.

기존에 중복 컬럼인 김종한과 이현준을 따로 분리시켰습니다.

제2 정규화 (2NF)

릴레이션이 제1 정규화에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속이 되면 제2정규화에 속합니다.

제1 정규화를 완료한 테이블에서, 부분 함수 종속성을 제거하는 과정입니다.

기본키의 부분집합에 의존하는 필드는 따로 분리해서 다른 테이블을 만드는 것이다.

쉽게 말해 현재 테이블의 주제와 관련 없는 컬럼을 다른 테이블로 빼는 작업입니다.

  • 완전 함수 종속
    • 어떤 속성이 기본키에 대해 완전히 종속일 때
  • 부분 함수 종속
    • 어떤 속성이 기본키가 아닌 다른 속성에 종속이거나, 기본키가 여러 개일 때 일부에만 종속된 상태

 

아래 테이블을 보면 수강과목은 수강과목 ID에 종속되어 있으며, 수강자는 수강자 ID에 종속되어 있습니다.

 

발생할 수 있는 이상현상

  • 삽입 이상
    • 새로운 수강과목이 등록된다면 테이블의 구조상 수강과목 ID와 수강과목뿐만 아니라 수강자와 수강자 ID 컬럼도 함께 채워야 하는 문제가 발생한다.
    • 그럼 아직 수강자가 없는 새로운 수강과목을 등록시키려면 수강자 컬럼에는 null로 채울 수밖에 없다.
  • 수정 이상
    • 이현준 학생이 여러 수강을 듣고 있는 상황일 때 이름을 최현준으로 바꾼다면 모든 컬럼에서 이름을 바꿔줘야 한다.
    • 일부 행을 수정하지 못할 경우 데이터의 범주 불일치가 발생한다.
  • 삭제 이상
    • 보안 과목이 삭제된다면 박주홍 수강자의 정보도 함께 사라진다.

제2 정규화 적용 후

제2 정규화를 적용하면 다음과 같이 3개의 테이블로 분리할 수 있다.

 

아래와 같이 테이블을 분리할 시 장점

  • 각 테이블들이 수강신청, 수강과목, 수강자 등 각각의 역할에 집중할 수 있습니다.
  • 중복이 크게 줄어 데이터의 무결성이 유지됩니다.
  • 불필요한 작업을 줄일 수 있습니다.

 

제3 정규화 (3NF)

제2 정규화를 완료한 테이블에서, 이행적 함수 종속성을 제거하는 과정입니다.

이행적 함수 종속이란 A -> B 종속, B -> C 종속 관계가 성립할 때 A -> C 종속관계가 성립되는 것을 의미합니다.

이행적 함수 종속

  • A -> B, B -> C 인 경우 A -> C가 성립될 때
  • 즉 A를 알면 B를 알고 그렇게 되면 C까지 알 수 있는 경우를 의미

위 테이블에서는 학생 번호는 강좌이름을 결정하고 있고, 강좌이름은 수강료를 결정하고 있다. 결국, 학생 번호로 수강료를 결정할 수 있음으로 제3 정규형을 만족하지 않는 테이블이다. 현재 테이블을 제3 정규형을 만족하도록 하기 위해서는 (학생 번호, 강좌이름) 테이블 하나, 

(강좌이름, 수강료) 테이블 하나 이렇게 테이블을 두 개로 분리할 필요가 있다.

 

왜 이렇게 분리를 해야하나 ?

만약 501 학생이 강좌를 NCS로 바꾼다면 20000원의 수강료로 NCS 강좌를 듣게 되는 셈이다. 그런 상황에서는 수강료를 NCS에 맞게 50000원으로 바꾸는 방법도 있는데 지금은 데이터가 별로 없지만 큰 규모의 서비스라면 엄청나게 많은 데이터를 수정하게 되는 번거로운 일이 발생할 겁니다. 

 

제3 정규화 적용 후

학생번호를 통해  강좌이름을 참조하고, 강좌이름으로 수강료를 참조하도록 테이블을 분해해야 하며 그 결과로 인한 테이블은 다음과 같다.

 

이렇게 되면 학생번호 -> 강좌이름, 강좌이름 -> 수강료를 참조하게 된다.

 

 

정규화의 단점

  • 릴레이션의 분해로 인해 릴레이션 간의 조인(Join)이 많아진다.

 

 

728x90

'DB' 카테고리의 다른 글

[DB] Redis Cache 🔥  (0) 2024.07.08
[DB] INNER 조인 & OUTER조인 🤚  (0) 2024.02.29
[DB] 인덱스(Index)란? 😛  (1) 2024.01.31
[DB] DBCP 이란? 🫶  (0) 2024.01.28
[DB] 이상 현상이란 ??👍🏿  (0) 2024.01.25