상세 컨텐츠

본문 제목

[DB] 데이터 모델링 - 정규화(Normalization)란?

DevOps/DB-데이터베이스설계

by 사랑짱 2021. 5. 27. 17:11

본문

 

정규화

- 관계형 스키마를 더 좋은 구조로 정제해 나가는 과정

- 함수적 종속성(속성 간의 관계 분석)을 기반으로 해서

  일정한 조건을 만족하는 형태로 엔티티를 분해하는 과정

 

<정규화가 되지 않을 때 문제점>

중복된 정보로 인한 문제
특정 정보의 표현불가
NULL값 보유

 

 


 

 

제 1 정규화 - Atomic Columns

 

 정의 : 복수의 속성 값을 갖는 속성을 분리하는 것 (중복과 반복을 없애는 것)

 

◆ 원리 : 컬럼은 원자성을 가지며, 모든 속성은 반드시 값이 하나다.

 

◆ 방법 

- 하나의 속성이 하나의 값을 가질 수 있도록 분해 (튜플 증가)

- 여러 개의 속성 값을 갖는 속성을 다른 관계로 분해 (새로운 엔티티 생성)

 

 

<예시>

 

이런 경우 Major 속성의 값이 두개이므로 속성의 분리가 필요하다.

 

학생ID Name Phone Number Major
1 홍길동 010-123-4567 컴퓨터공학과, 경영학과
2 김유신 010-987-6543 경영학과

 

 

하지만, 아래와 같이 단순히 컬럼이 하나의 값을 가지도록 수정했을 때 문제가 발생한다.

방법1.

학생ID Name Phone Number Major
1 홍길동 010-123-4567 컴퓨터공학과
1 홍길동 010-123-4567 경영학과
2 김유신 010-987-6543 경영학과

방법2.

학생ID Name Phone Number Major1 Major2
1 홍길동 010-123-4567 컴퓨터공학과 경영학과
2 김유신 010-987-6543 경영학과 Null

 

문제점 1. 중복 발생

문제점 2. 컬럼 추가로 인한 구조변형

문제점3. 원하는 정보조회의 어려움

 

따라서 복합적인 의미를 가지고 있는 속성을 분리하여 하나의 의미를 가질 수 있도록 해야한다. 

 

학생ID(PK) Name Phone Number
1 홍길동 010-123-4567
2 김유신 010-987-6543

 

Major(PK) 소속학생 ID
컴퓨터공학과 1
경영학과 1
경영학과 2

 

1차 정규화가된 상태를 1차 정규형이라고 한다.
1차 정규형은 모든 속성이 한개의 값을 갖는다.

 

 

 


 

 

 

제 2 정규화 - No partial dependencies(부분 종속성)

 

 정의 : 부분 함수적 종속관계를 제거하는 것

 

◆ 원리 : 모든 속성은 반드시 주식별자 속성에 종속되어야 한다.

 

◆ 방법 : 복합키가 구성되었을 때 부분적으로 종속된 속성을 분해(새로운 엔티티 생성)

 

 

<예시>

 

학번, 과목코드에서 부분 함수인 학번 혼자서도 학부와 등록금을 결정할 수 있다. 

이에 따라 성적, 학부, 등록금에 모두 영향을 주는 학번을 기준으로 관계를 분해한다.

 

학번(PK) 과목코드(PK) 성적 학부 등록금
2021001 ABC01 A+ 컴퓨터공학과 350
2021002 ABC02 C 경영학과 300
2021003 ABC03 B 컴퓨터공학과 350
2021004 ABC04 D 기계공학부 400

 

 

2차 정규화 과정을 거치면 이렇게 관계를 분리할 수 있다.

이와 같이 종속된 함수관계에 따라 분리하면 2차 정규형을 만족하게 된다.

 

학번(PK) 학부 등록금
2021001 컴퓨터공학과 350
2021002 경영학과 300
2021003 컴퓨터공학과 350
2021004 기계공학 400

 

학번(PK) 과목코드(PK) 성적
2021001 컴퓨터공학과 A+
2021002 경영학과 C
2021003 컴퓨터공학과 B
2021004 기계공학 D

 

2차 정규화가된 상태를 2차 정규형이라고 한다.
2차 정규형은 주키에 대해 완전한 함수 종속관계를 가진다.

 

 

 


 

 

 

제 3 정규화 - No transitive dependencies

 

 정의 : 이행 함수적 종속을 제거 (이행 규칙 : X → Y 이고 Y → Z 이면 X → Z 이다.)

 

◆ 원리 : 주 식별자를 제외한 나머지 속성들은 상호 종속 관계여서는 안된다.

◆ 방법 : 식별자 외에 속성들 간의 종속이 존재하지 않도록 관계를 분해

 

 

<예시>

 

아래 테이블에서는 학번이 학부를 결정하고,

학부가 등록금을 결정하고, 이행 규칙에 따라 학번이 등록금을 결정한다.

(이행 규칙 성립 : 학번 학부, 학부 등록금, 학번 등록금)

이행규칙이 만족하므로 이행함수적 종속을 제거해야 한다.

 

학번(PK) 학부 등록금
2021001 컴퓨터공학과 350
2021002 경영학과 300
2021003 컴퓨터공학과 350
2021004 기계공학 400

 

학번(PK) 과목코드(PK) 성적
2021001 컴퓨터공학과 A+
2021002 경영학과 C
2021003 컴퓨터공학과 B
2021004 기계공학 D

 

 

3차 정규화 과정을 거치면 이렇게 관계를 분리할 수 있다.

이와 같이 이행 함수종속을 분리하면 3차 정규형을 만족하게 된다.

학번(PK) 학부
2021001 컴퓨터공학과
2021002 경영학과
2021003 컴퓨터공학과
2021004 기계공학

 

학부(PK) 등록금
컴퓨터공학과 350
경영학과 300
기계공학 400

 

학번(PK) 과목코드(PK) 성적
2021001 컴퓨터공학과 A+
2021002 경영학과 C
2021003 컴퓨터공학과 B
2021004 기계공학 D

 

3차 정규화가된 상태를 3차 정규형이라고 한다.
3차 정규형은 주키를 제왼한 나머지 속성들 간의 종속이 존재하지 않는다.

 

 

 


 

 

 

보이스코드 정규화(Boyce-Codd NF)

: BCNF는 제 3정규형보다 강한 정규형이다.

  즉, BCNF를 만족한다면 제 3정규형도 만족하지만,

  제 3정규형만 만족한다면 BCNF를 만족할지는 살펴볼 필요가 있다.



 원리 : 모든 결정자는 주식별자가 되어야 한다

- 기본키가 둘 이상의 속성으로 구성된 합성 키이고

  합성키가 둘 이상 존재하는 경우 발생하는 이상현상을 방지하기 위해 고안

 

◆ 방법 : 결정자 중 후보키를 제거하도록 테이블을 분해

 

 

 

Every entity in your database

needs to have a single thema!

 

 

관련글 더보기