[IT]/Database

[Database] 데이터베이스 정규화(Normalization)란? (정규화의 목적, 과정, 이상현상, 1NF ~ 3NF)

ee2ee2 2021. 12. 8. 20:02
728x90
반응형

정규화의 사전적 의미를 살펴보면, 어떤 대상을 일정한 규칙이나 기준에 따르는 ‘정규적인’ 상태로 바꾸거나, 비정상적인 대상을 정상적으로 되돌리는 과정을 뜻한다.

- 위키백과 -


그럼, 데이터베이스에서 정규화란 무엇을 의미할까?

1. 데이터베이스 정규화(Normalization)란?

: 기본 목표는 테이블 간의 데이터 중복을 허용하지 않는다는 것이다. 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 방법으로 속성들끼리의 종속 관계를 분석하여 여러개의 관계(Relation)로 데이터를 분해하는 것을 의미한다.


 

2. 정규화의 목적

 1) 불필요한 데이터를 제거해 불필요한 중복을 최소화하기 위함.

 2) 데이터베이스 구조 확장시 재디자인을 최소화하기 위함

 3) 다양한 관점에서의 Query를 지원하기 위함

 4) 무결성 제약조건의 시행을 간단하게 하기 위함  

 5) 각종 이상 현상(Anomaly)을 방지하기 위해서, 테이블의 구정을 논리적이고 직관적으로 하기 위함.


3. 이상 현상(Anomaly)이란?

: 테이블 내의 데이터들이 불필요하게 중복되어 있어 테이블을 조작할 때 발생되는 데이터 불일치 현상을 의미한다.

크게 3가지 삽입, 삭제, 수정 이상이 존재하며 이는 정규화를 통해 해결 가능하다.

-. 삽입 이상(Insertion anomaly) : 원하지 않는 데이터가 삽입되거나, Key가 없어 삽입하지 못하는 문제점

-. 삭제 이상(Deletion anomaly) : 하나의 데이터만 삭제하고 싶지만, 그 데이터가 포함된 한 행(Tuple) 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점

-. 갱신 이상(Update anomaly) : 중복된 튜플 중 일부만 변경하여 데이터가 불일치하는 모순이 발생하게 되는 문제점


4. 정규화의 과정

 : 정규화는 1~6 정규화까지 존재하지만, 실무에서는 대체로 1~3 정규화까지의 과정을 거친다.

 

1) 제 1정규화 (First Normal Form, 1NF)

 : 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 방식

Ex) 학생 정보

학생 번호 이름 학년 좋아하는 과목
1 에이 1 국어
2 비비 1 영어, 수학
3 씨씨 1 수학
4 디디 2 수학, 과학
5 이이 2 사회

위의 테이블에서는 비비와 디디는 여러개의 과목을 좋아한다. 이는 제 1정규형을 만족하지 못한다.  제 1정규형에 맞춰 수정을 진행하면 아래와 같다.

학생 번호 이름 학년 좋아하는 과목
1 에이 1 국어
2 비비 1 영어
2 비비 1 수학
3 씨씨 1 수학
4 디디 2 수학
4 디디 2 과학
5 이이 2 사회

 

 

2) 제 2정규화 (Second Normal Form, 2NF)

 : 제 1정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해 (부분 함수 종속을 제거하는 것)하는 것이다. 여기서, 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된 다는 것을 의미한다.

더보기
  • 함수적 종속이란?

  : X의 값에 따라 Y값이 결정될 때 X -> Y로 표현하는데, 이를 Y는 X에 대해 함수적 종속 이라고 한다.

Ex) 학번을 알면 이름을 알 수 있는데, 이 경우엔 학번이 X가 되고 이름이 Y가 된다. X를 결정자이라고 하고, Y는 종속자라고 한다. 다른 말로 X가 바뀌었을 경우 Y가 바뀌어야만 한다는 것을 의미한다.

  • 함수적 종속에서 X의 값이 여러 요소일 경우, 즉, {X1, X2} -> Y일 경우, X1와 X2가 Y의 값을 결정할 때 이를 완전 함수적 종속 이라고 하고, X1, X2 중 하나만 Y의 값을 결정할 때 이를 부분 함수적 종속 이라고 한다.

[출처] https://wkdtjsgur100.github.io/database-normalization/

 

Ex) 학생 수강 정보 

학생번호 수강과목 강사이름 성적
1 데이터베이스 박디비 A
2 데이터베이스 박디비 B
3 운영체제 김운영 A
4 자료구조 김자료 C
5 운영체제 김운영 B
6 테니스 이체육 A

위 테이블에서 기본키는 {학생번호, 수강과목}으로 복합키이다. {학생번호, 수강과목}인 기본키는 성적을 결정하고 있다. 

{학생번호, 수강과목} -> {성적}

{학생번호, 수강과목} : 결정자 / {성적} : 종속자

이 때, 강사이름이라는 컬럼은 기본키의 부분집합인 수강과목에 의해 결정될 수 있다.

{수강과목} -> {강사이름}

{수강과목} : 결정자 / {강사이름} : 종속자

즉, 기본키 {학생번호, 수강과목}의 부분키인 수강과목이 결정자의 역할을 하기 때문에 제 2정규형의 원칙에 어긋난다. 아래와 같이 별도의 테이블로 관리하여 제 2 정규형을 만족할 수 있도록 한다.

 

Ex) 학생 수강 정보 (한 사람당 한 과목만 듣는다고 가정)

학생번호 수강과목 성적
1 데이터베이스 A
2 데이터베이스 B
3 운영체제 A
4 자료구조 C
5 운영체제 B
6 테니스 A

{학생번호, 수강과목} -> {성적}

Ex) 수강과목 정보

수강과목 강사이름
데이터베이스 박디비
운영체제 김운영
자료구조 김자료
테니스 이체육

{수강과목} -> {강사이름}

 

 

3) 제 3정규화 (Third Normal Form, 3NF)

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

더보기
  • 이행적 종속이란?

A -> B, B -> C 가 성립할 때, A -> C가 성립되는 것을 이행적 종속이라 한다.

 

현재 아래 테이블은 학생번호(A)가 수강과목(B)을 결정하고, 수강과목(B)이 수강료(C)을 결정할 때, 학생번호(A)가 수강료(C)을 결정하는 것이 성립한다.

즉, {학생번호} -> {수강과목} / {수강과목} -> {수강료} / {학생번호} -> {수강료}

Ex) 학생 수강 정보 (한 사람당 한 과목만 듣는다고 가정)

학생번호 수강과목 수강료
1 데이터베이스 200
2 데이터베이스 200
3 운영체제 250
4 자료구조 300
5 운영체제 250
6 테니스 150

 

이행적 종속 제거가 필요한 이유를 알아보자.

위 테이블의 경우, 1번 학생이 수강과목이 테니스로 변경되면 테니스 과목의 수강료를 200을 내고 듣게된다. 물론 수강료도 과목에 맞게 변경하면 되지만 범위가 커져 수정에 번거로움이 있으며, 실수가 발생할 수 있다.

 

이를 이행적 종속이 성립하지 않도록 분해해보자.

Ex) 학생 수강 정보

학생번호 수강과목
1 데이터베이스
2 데이터베이스
3 운영체제
4 자료구조
5 운영체제
6 테니스

{학생번호} -> {수강과목}

Ex) 수강과목 정보

수강과목 수강료
데이터베이스 200
운영체제 250
자료구조 300
테니스 150

{수강과목} -> {수강료