만쥬의 개발일기
article thumbnail

KEY에 대한 이해가 부족하다면 KEY를 정리한 포스팅을 먼저 보고 오자.

2023.07.19 - [📚CS/📘데이터베이스] - [DATABASE] - Key 완벽 이해하기 (기본키, 후보키, 외래키 등)

 

[DATABASE] - Key 완벽 이해하기 (기본키, 후보키, 외래키 등)

key는 데이터베이스의 가장 중요한 개념이다. key는 데이터베이스(혹은 릴레이션) 내에서 특정 레코드(tuple)를 고유하게 식별하기 위해 사용되는 필드 또는 속성(attribute)을 의미하고, 그 종류로는

kangmanjoo.tistory.com

정규화(Normalization)란?

정규화(Normalization)의 기본 목표는 테이블 간에 중복된 데이타를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않음으로서 무결성(Integrity)을 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.

테이블을 분해하는 방법에 따라 정규화가 나뉘어져 있는데, 각 정규화를 하는 법하는 이유에 대해 알아보자.


제1 정규화 (1NF)

제1 정규화란 한 속성(column)에는 하나의 값만을 가지도록 하는 것이다.

다음과 같은 학생 릴레이션이 존재한다고 생각해보자.

위의 테이블에서 강만쥬와 유석창은 여러 개의 강의를 듣고, 해당 column에서 여러 값을 가지고 있기 때문에 제1 정규형을 만족하지 못하고 있다. 그렇기 때문에 이를 제1 정규화하여 분해할 수 있다. 제1 정규화를 진행한 테이블은 아래와 같다.

제1 정규화를 하지 않았을 때 발생하는 문제점

만약 운영체제를 수강하는 학생을 쿼리문으로 찾고 싶을때, 한 column에 여러 값이 존재한다면 쿼리문이

상당히 복잡해질 가능성이 높다. 


제2 정규화 (2NF)

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

 

쉽게 말해, 현재 테이블을 관통하는 주제와 크게 상관 없는 column을 따로 분리하는 것이다.

 

예를 들어 아래와 같은 학생 성적 테이블을 살펴보자. 

이 테이블에서 기본키는 (학번, 강의명)으로 복합키이다. (학번만으로는 유일성 x) 그리고 (학번, 강의명)인

기본키는 학점을 결정하고 있다. (학번, 강의명) --> (성적)
그런데 여기서 강의실이라는 column은 기본키의 부분집합인 강의명에 의해 결정될 수 있다.

(강의명) --> (강의실)


즉, 기본키(학번, 강의명)의 부분키인 강의명이 한 column의 결정자이기 때문에 위의 테이블의 경우

다음과 같이 기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다.

학생 성적 테이블
강의 테이블

쉽게 말하자면, 학생 테이블에서는 크게 중요치 않은 강의실 정보를 따로 빼는 것이다.

제2 정규화를 하지 않았을 때 발생하는 문제점 

만약 제2 정규화를 하지 않은 상태에서 데이터베이스 강의의 강의실이 변경될 경우,

데이터베이스를 수강하는 모든 학생들의 튜플을 방문하여 값을 일일이 고쳐주어야 한다.


제3 정규화 (3NF)

제3 정규화란 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 여기서 이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.

 

예를 들어 아래와 같은 교수별 강의 테이블을 살펴보자. 

한 교수님당 하나의 강의를 한다고 가정한다.

기존의 테이블에서 교수명은 강의를 결정하고 있고, 강의명은 강의실을 결정하고 있다.

이처럼 기본키(교수명)이 아닌 일반키가 다른 column의 결정자가 되는 경우, 제3 정규화가 필요하다.

제3 정규화를 하지 않았을 때 발생하는 문제점 

만약 운영체제의 강의실이 공학관B 361호로 변경된다면, 운영체제를 강의하는 교수 튜플의 모든 강의실

정보를 변경해주어야 한다. 이런 번거로움을 덜고자, 제3 정규화를 해주어야 한다.


BCNF 정규화

BCNF(Boyce and Codd Normal Form)란 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다. 앞선 제3 정규화의 경우는 이행적 종속성만을 제거해주었지만, BCNF의 경우는 모든 키가 후보키에 대해 종속성을 가지게 된다.

 

예를 들어 다음과 같은 특강 수강 테이블이 존재한다고 하자.

특강수강 테이블에서 기본키는 (학번, 강의명)이다. 그리고 기본키 (학번, 강의명)은 교수를 결정하고 있다.

즉, (학번, 강의명) ---> (교수)이다.

그런데 여기서 교수 또한 강의명을 결정하고 있다. 즉, (교수) ---> (강의명) 이다.

그런데 문제는 교수가 강의명을 결정하는 결정자이지만, 후보키가 아니라는 점이다. 그렇기 때문에 BCNF 정규화를 만족시키기 위해서 위의 테이블을 분해해야 하는데, 다음과 같이 특강신청 테이블과 특강교수 테이블로 분해할 수 있다.

BCNF 정규화를 하지 않았을 때 발생하는 문제점 

BCNF 정규화를 지키지 않았다면, 컴퓨터구조를 강의하는 교수를 찾기 위해서 특강 수강 테이블을 모두 뒤져보았어야 할 것이다.

 

 

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

profile

만쥬의 개발일기

@KangManJoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!