본문 바로가기

CS?/데이터베이스보안실습

[복습]데이터베이스 정규화 -2 (1NF, 2NF)

반응형

이번 포스팅은 데이터베이스 정규형인 1NF, 2NF를 다룬다.

 

 

1. 제1정규형(1NF)

 -애트리뷰트의 도메인이 오직 원자값(atomic value)만 포함하고, 투플에 모든 애트리뷰트 값은 그 애트리뷰트 도메인에 속하는 하나의 값이어야 함

 

제1정규형을 한마디로 정의하면

"중복되거나 테이블 한 칸에 값이 두개 이상 들어가면 안된다"가 되겠다.

 

예를 들어, 학생 정보 릴레이션이 있다 하자.

이름 학번 전공 전화번호
김애용 20190001 고양이학과, 호랑이학과 010-1234-1234
박꿀꿀 20190002 돼지학과 010-1234-5678

이 때, 김애용의 전공 애트리뷰트 값은 {고양이학과, 호랑이학과}로 두개를 갖는다.

하지만 제1정규형은 "원자값"을 가지는 경우이기 때문에 김애용의 전공 애트리뷰트 상태는 잘못된 상태가 된다.

 

그렇다면 제1정규형을 만족시키기 위해선 어떻게 해야할까?

 

sol1) 기본키를 {학번, 전공}으로 한다

이름 학번 전공 전화번호
김애용 20190001 고양이학과 010-1234-1234
김애용 20190001 호랑이학과 010-1234-1234
박꿀꿀 20190002 돼지학과 010-1234-5678

학생 정보 릴레이션의 기본키를 {학번, 전공}으로 하게 될 경우 현재 주어진 릴레이션 상태의 애트리뷰트 값은 모두 원자값이 되어 제1정규형의 조건을 충족한다.

 

하지만 김애용 학생의 '전공'을 제외한 나머지 애트리뷰트의 값이 중복 되기 때문에 저장공간이 낭비된다는 단점이 있다.

 

sol2) 전공 애트리뷰트의 최대 개수에 따라 애트리뷰트를 분해한다

 

만약, '전공' 애트리뷰트가 최대 2개까지 값을 가질 수 있다 가정하자.

이름 학번 전공1 전공2 전화번호
김애용 20190001 고양이학과 호랑이학과 010-1234-1234
박꿀꿀 20190002 돼지학과   010-1234-5678

우선, 현재 주어진 릴레이션 상태의 애트리뷰트 값은 모두 원자값이 되어 제1정규형의 조건을 충족하게 된다.

 

하지만 

 1. 박꿀꿀 학생의 '전공2' 애트리뷰트 값이 NULL인 것 처럼 다른 전공2에 해당사항이 없는 학생은 '전공2'애트리뷰트 값이 NULL이 된다

 2. '전공1' 애트리뷰트와 '전공2' 애트리뷰트 사이에 순서가 생긴다

 3. 값을 불러오는 질의 작성시 질의가 더 복잡해진다

등의 단점이 있다.

 

sol3) 문제가 되는 애트리뷰트를 다른 릴레이션으로 만든다

 

현재 문제가 되는 전공을 다른 릴레이션으로 내보낼 경우

이름 학번 전화번호
김애용 20190001 010-1234-1234
박꿀꿀 20190002 010-1234-5678

 

학번 전공
20190001 고양이학과
20190001 호랑이학과
20190002 돼지학과

위와 같이 두 릴레이션으로 만들 수 있다.

 

즉, 하나의 릴레이션이 제1정규형을 만족하는 릴레이션 두개로 쪼개진다.

 

sol1~sol3 중 sol3이 가장 우수하게 여겨지는 제1정규형을 만족시키는 방법이다.

 

 

 

2. 제2정규형(2NF)

 -릴레이션 스키마의 모든 비주요 애트리뷰트들이 릴레이션 스키마의 기본키에 대해 완전하게 함수적으로 종속하면 이 릴레이션 스키마는 제2정규형을 만족한다.

 

즉, 릴레이션 내 후보키에도 속하지 않는 애트리뷰트들이 기본키에 완전하게 함수적으로 종속하는 경우 제2정규형을 만족하는 것이다.

 

**비주요 애트리뷰트란, 후보키가 아닌 모든 애트리뷰트를 말한다.

 

여기 사원의 정보와 프로젝트 정보가 함께 저장되는 릴레이션 스키마의 함수적 종속성을 나타낸 그림이 있다.

이 릴레이션에는 총 3가지 함수적 종속성(FD1~FD3)이 나타나 있다.

 

먼저 FD1부터 보자.

'일한 시간'은 기본키 조합인 {사번+프로젝트번호}으로 기본키에 완전하게 함수적으로 종속함을 볼 수 있다.

=>FD1은 제2정규형을 만족한다.

 

FD2의 경우, '이름'은 기본키 {사번}에만 함수적으로 종속하는 것을 볼 수 있다.

이 경우, 기본키에 함수적으로 종속하지만, 기본키에 완전 종속하지 않는다.

=>FD2는 제2정규형을 만족하지 않는다.

 

FD3의 경우, '프로젝트 이름'과 '프로젝트 부서'는 기본키 {프로젝트번호}에만 함수적으로 종속하는 것을 볼 수 있다.

이 경우도 기본키에 함수적으로 종속하지만, 기본키에 완전 종속하지 않는다.

=>FD3은 제2정규형을 만족하지 않는다.

 

위 FD2, FD3의 경우로, 

함수적으로 완전종속 하기 위해선, 기본키 '조합'(기본키)에 모든 후보키(기본키, 보조키)가 아닌 비주요 애트리뷰트들이 함수적으로 종속해야 한다는 것이다.

 

다시 말해, 기본키가 N개라면 나머지 애트리뷰트는 N개의 기본키가 모두 모여 있어야 식별되어, N개의 기본키에 대해 완전하게 함수적으로 종속한다는 뜻이다.

 

 

그렇다면, 위에 나온 릴레이션이 제2정규형을 만족하기 위해선 어떻게 해야 할까?

바로, 기본키를 기반으로 릴레이션을 분해한다.

 

FD1은 기본키에 완전종속 했으니, 그대로 유지한다.

사번 프로젝트번호 일한시간

 

FD2는 '사번'이라는 기본키에 이름이 함수적 종속성을 가지므로 다음과 같이 만든다.

사번 이름

 

FD3는 '프로젝트번호'라는 기본키에 '프로젝트 이름'과 '프로젝트 부서'가 함수적 종속성을 가지므로 다음과 같이 만든다.

프로젝트번호 프로젝트 이름 프로젝트 부서

 

이렇게 원래 제2정규형을 만족하지 않던 릴레이션 스키마를 FD1, FD2, FD3로 분해하여 제2정규형을 만족할 수 있다.

 

 

정규형 1NF, 2NF와 관련된 개념은 앞선 포스팅에서 참고하면 됩니다. [포스팅 이동]

 

[복습]데이터베이스 정규화 -1 (1NF, 2NF, 3NF, BCNF)

1. 데이터베이스 정규화란? 1)데이터의 중복을 최소화 2)삽입, 삭제, 수정 시 발생하는 이상 현상을 최소화 두 현상을 최소화 하기 위해 함수적 종속성과 기본키를 기반으로주어진 릴레이션 스키마를 분석하는 과..

zzozzomin08.tistory.com

 


피드백은 언제나 대환영입니다 :)

반응형