3NF(Third Normal Form) 정규형

3NF 정규형을 만족하려면 릴레이션 내의 이행적 함수 종속을 제거해야 합니다.

이행적 함수 종속은 이전에 설명했듯 (X→Y) 종속관계이고 (Y→Z) 종속관계일때 (X→Z)도 성립하는 경우를 말합니다.

 

사원번호 이름 소속팀 소속부서
1234 김땡땡 인사 경영
1235 박땡땡 TV 생산
1500 최땡땡 스마트폰 생산
2000 이땡땡 R&D 연구

예를 들어 어떤 전자회사의 인적자원을 위와 같은 릴레이션으로 관리할 때, 사원번호를 알면 소속팀을 알 수 있습니다.

그런데 소속부서는 소속 팀을 통해서 알 수 있어 이행적 함수 종속이 발생합니다.

또 이런 이행적 종속으로 인해 이상현상이 발생하게 됩니다.

 

해결방법은 앞의 다른 정규형들처럼 테이블을 나눠 이행적 종속관계를 없애면 됩니다.

 

사원번호 이름 소속팀
1234 김땡땡 인사
1235 박땡땡 TV
1500 최땡땡 스마트폰
2000 이땡땡 R&D

 

 

소속팀 소속부서
인사 경영
TV 생산
스마트폰 생산
R&D 연구
728x90

2NF(Second Normal Form) 정규형

2NF 정규형을 만족하려면 릴레이션에서 부분적 함수 종속이 사라지고 완전 함수 종속이 되어야 합니다.

함수 종속성에 대해서는 이전에 정리했으니 릴레이션으로 예시를 들며 설명해 보도록 하겠습니다.

 

함수종속성에서 예를 들었던 아래와 같은 릴레이션이 있습니다.

과목번호 수업번호 과목명 강의실
S100 C100 데이터베이스 강의관 101
S100 C101 데이터베이스 강의관 102
S101 C102 자료구조 강의관 201
S102 C103 운영체제 강의관 202

이 릴레이션의 기본키는 수업번호입니다.

하지만 과목명은 과목번호에 종속되어 있습니다. 과목번호가 당연히 기본키가 아니기 때문에 이는 부분적 함수 종속성이 있음을 의미합니다.

함수종속성의 설명에서 보았듯 이런 종속성 때문에 튜플의 삽입, 삭제, 갱신에서 이상현상이 발생합니다.

수업이 사라지면 과목의 정보가 사라지기도 하고, 과목명이 바뀌면 해당하는 모든 튜플을 전부 갱신해주어야 합니다.

 

2NF 정규형을 만족하도록 부분 종속성을 가지는 과목번호와 과목명을 따로 빼어 릴레이션을 나누면

수업번호 과목번호 강의실
C100 S100 강의관 101
C101 S100 강의관 102
C102 S101 강의관 201
C103 S102 강의관 202

 

과목번호 과목명
S100 데이터베이스
S101 자료구조
S102 운영체제

DB를 조작함에서 이상현상이 사라지는것을 알 수 있습니다.

 

3NF 정규형에 대해서는 다음 글에서 설명해 보도록 하겠습니다.

728x90

정규형에는 1부터 5까지의 정규형(Normal Form)과 BCNF(Boyce and Codd Normal Form)가 있습니다.

4NF와 5NF는 간단히 개념만 설명하고 나머지 4개의 정규형을 정규화과정의 예시를 들어 하나씩 설명해 보도록 하겠습니다.

 

1NF (First Normal Form) 정규형

1NF정규형이 되려면 도메인이 원자값만 가져야 합니다.  

 

예를 들어 정규화가 되지 않은 아래와 같은 릴레이션이 있습니다.

수강자 어트리뷰트에 학생들의 이름이 여러개 들어있는 걸 볼 수 있습니다.

과목번호 과목명 수강자 강의실
S100 자료구조 김땡땡,최땡땡,박땡땡 107호
S101 알고리즘 김땡땡,이땡땡 104호
S102 데이터베이스 정땡땡,황땡땡 102호

그런데 김땡땡씨가 조기졸업을 해서 수강자에서 지워져야 한다고 생각해 봅시다.

김땡땡 씨가 있는 튜플을 지우면 다른 수강자들의 정보까지 지워지며 이상현상이 발생합니다.

(과목의 정보도 사라지지만 이건 다음 정규화에서 말하도록 하겠습니다.) 

 

 

1NF를 만족시키게 릴레이션을 바꿔 보겠습니다.

과목번호 과목명 수강자 강의실
S100 자료구조 김땡땡 107호
S100 자료구조 최땡땡 107호
S100 자료구조 박땡땡 107호
S101 알고리즘 김땡땡 104호
S101 알고리즘 이땡땡 104호
S102 데이터베이스 정땡땡 102호
S102 데이터베이스 황땡땡 102호

수강자 어트리뷰트의 값이 하나만 되도록 튜플을 나누어 주었습니다.

이제 어떤 수강생이 듣는 강의 정보를 지우거나 갱신할 일이 생기더라도 다른 수강자들의 정보엔 영향을 끼치지 않습니다.

 

2NF에 관해서는 다음 글에서 이어서 설명해 보도록 하겠습니다.

728x90

1. 함수종속성

함수적 종속성은 속성들의 집합 두 개 사이의 제약조건입니다.

다시 말해 어떤 릴레이션의 속성 X와 Y가 있을때, 튜플 Y의 값이 X에 의해 결정되거나 종속된다는 것입니다. (X→Y)

 

또 이 함수 종속성은 세개로 나뉘는데,

완전 함수 종속 : 속성이 기본키에만 종속되고, 기본키가 여러 속성으로 구성된 경우 기본키의 모든 속성에 종속되는 경우. 

부분 함수 종속 : 기본키가 아닌 속성에 종속되거나, 기본키의 일부 속성에 종속된 경우.

이행 함수 종속 : (X→Y) 종속관계이고 (Y→Z) 종속관계일때 (X→Z)도 성립하는 경우.

 

EX)

학번 이름 학년 학과
2XXXX1234 김땡땡 1 소프트웨어
2XXXX1111 박땡땡 2 정보통신
2XXXX4321 최땡땡 3 전자
2XXXX5678 황땡땡 2 소프트웨어

대학생의 학생정보를 담은 이런 릴레이션이 있다고 했을때, 이름 학년 학과의 정보는 학번에 종속됩니다. (완전 함수 종속)

이름에도 종속되는게 아니냐 생각할 수도 있지만, 동명이인이 있어 아래와 같은 학생이 존재한다면 이름만 가지고선 학년과 학과 정보를 알 수 없습니다.

2XXXX1233 김땡땡 2 전자

따라서 이름은 종속관계를 가지지 않습니다.

 

 

과목번호 수업번호 과목명 강의실
S100 C100 데이터베이스 강의관 101
S100 C101 데이터베이스 강의관 102
S101 C102 자료구조 전자관 201
S102 C103 운영체제 전자관 202

대학교 강의 정보를 담은 위와 같은 릴레이션이 있다고 했을때 기본키는 수업번호입니다.

하지만 과목명은 과목번호만 알아도 알아낼 수 있습니다. (부분 함수 종속)

또한 강의실이 수업마다 배정된다면, 강의실도 수업번호에 부분 함수 종속이 됩니다.

 

 

2. 이상현상(Anomaly)

이상현상은 릴레이션 안에 같은 데이터가 불필요하게 중복되어 발생하는 현상으로 삽입이상, 삭제이상, 갱신이상의 세가지 종류가 있습니다.

 

위의 대학교 강의정보 릴레이션을 예로 들어서 설명하겠습니다.

 

다음 학기부터 새로운 과목인 [데이터사이언스]과목이 신설될 예정입니다. 하지만 아직 수요조사가 끝나지 않아 몇개의 강의가 열릴지 미정된 상태입니다. 그럼 우리는 이 과목을 릴레이션에 등록할때 두 개의 NULL값을 가지게 됩니다. 

S103 NULL 데이터사이언스 NULL

또한 강의가 여러개 열린다면 같은 내용의 튜플을 여러개 등록해야겠죠. (삽입이상)

 

 

운영체제 강의가 신청자 미달로 폐강되었다고 합시다. 우리는 릴레이션에서 운영체제 수업을 삭제했습니다.

과목번호 수업번호 과목명 강의실
S100 C100 데이터베이스 강의관 101
S100 C101 데이터베이스 강의관 102
S101 C102 자료구조 전자관 201
S102 C103 운영체제 전자관 202

수업이 없어졌을 뿐이지만, 과목번호와 과목명까지도 함께 삭제되었습니다. (삭제이상)

 

학과 교육과정의 변경으로 과목번호 S100에 해당하는 과목이 데이터베이스에서 [C언어 입문]으로 변경되었습니다.

우리는 과목번호가 S100인 모든 튜플을 찾아서 값을 바꿔주어야 합니다. 예시에선 해당되는 튜플이 단 두개 뿐이지만 수억개의 데이터가 들어있는 실제 사용되는 DB라면 어마어마한 추가 작업이 필요합니다.

 

 

3. 정규화

릴레이션에 정보가 중복저장되어 있다면 DB의 가용공간을 낭비할 뿐만 아니라 위에서 보았듯 이상현상이 발생합니다. 이런 문제를 방지하기 위해 정규화 과정을 거칩니다.

 

예를 들어 위의 강의정보 릴레이션을 정규화 한다면,

과목번호 과목명
S100 데이터베이스
S101 자료구조
S102 운영체제

 

수업번호 과목번호 강의실
C100 S100 강의관 101
C101 S100 강의관 102
C102 S101 전자관 201
C103 S102 전자관 202

이렇게 두개의 릴레이션으로 쪼갤 수 있습니다.

 

위에서 발생했던 이상현상들을 정규화된 후에 적용시켜 본다면, 새로운 과목을 신설할땐 과목 릴레이션에 S103 - 데이터사이언스 라는 튜플을 추가하면 됩니다. (삽입이상이 발생하지 않음)

또 수업이 폐강되는 경우에도 수업 릴레이션에서 해당하는 수업의 튜플만 지우면 됩니다. 그 수업의 과목정보는 과목 릴레이션에 그대로 남아있습니다. (삭제이상이 발생하지 않음)

과목명이 바뀌는 경우에도 과목 릴레이션에서 해당하는 정보 튜플 하나만 수정하면 그 과목의 수업이 몇개든 상관없이 수정이 완료됩니다.

 

 

 

정규화 단계에 대해선 다음 글로 설명하도록 하겠습니다.

728x90

+ Recent posts