본문 바로가기
컴퓨터공학/데이터베이스

데이터베이스 정규화

by Daniel.kwak 2018. 10. 30.

목표

1.정규화의 개요

2.함수적 종속성

3.릴레이션 분해

4.제 1정규형, 제 2정규형, 제 3정규형, BCNF



정규화(Normalization)

부주의한 데이터베이스 설계로 제어할 수 없는 데이터 중복을 야기하여 여러가지 갱신이상을 유발한다.

 데이터베이스 정규화를 통해 주어진 릴레이션 스키마를 함수적 종속성과 기본 키를 기반으로 분석하여, 원래의 릴레이션으로 분해함으로써 중복과 세 가지 갱신이상을 최소화 하는것이다. 그렇다면 좋은 데이터베이스란 무엇일까? 정보의 중복과 갱신 이상이 생기지 않고, 정보의 손실을 막으며, 실 세계를 훌륭히 표현했으며, 애트리뷰트들 간의 관계가 잘 표현되는것을 보장하며 어떤 무결성 제약 조건의 시행을 간단하게 하여 효율성까지 고려하는것을 말한다.



갱신이상(Update anomaly)

-수정이상 : 반복된 데이터 중에 일부만 수정하면 데이터 불일치가 발생하는 것

-삽입이상 : 불필요한 정보를 함께 저장하지 않고는 어떤 정보를 저장하는것이 불가능함.

-삭제이상 : 유용한 정보를 함께 삭제하지 않고는 어떤 정보를 삭제하는 것이 불가능.


갱신이상의 예를 살펴보자.




1.정보의 중복: 사원이 속한 부서의 수 만큼 동일한 사원의 튜플이 존재한다.

2.수정이상: 부서의 이름이 바뀐다면 이 부서에 근무하는 일부 사원 튜플의 부서 이름만 변경한다면 데이터베이스 불일치 상태에 빠짐

3.삽입이상: 부서를 새로 신설했는데 사원을 아직 배정하지 않았다면, 부서에 관한 정보를 입력할 수가 없다.

4.삭제이상: 부서에 속한 사원이 한 명이 있는데, 이 사원을 삭제하면 이 사원이 속해있는 부서에 대한 정보도 삭제되어버린다.



릴레이션 분해

-하나의 릴레이션을 두 개 이상으로 나누는 것이다. 

-다만 분해된 릴레이션들로부터 원래의 릴레이션을 다시 구할 수 있음을 보장해야 한다는 원칙을 기반한다.

-분해를 잘못하면 두 릴레이션으로부터 얻는 정보가 기존 릴레이션보다 적을수도, 많을수도 있다.

-릴레이션 분해는 함수적 종속성에 관한 지식을 기반으로 한다.




함수적 종속성

정규화 이론의 핵심이다. 릴레이션의 애트리뷰트들의 의미로부터 결정이 되며, 릴레이션 스키마에 대한 주장이다.

함수적 종속성은 제 2정규형부터 BCNF까지 적용된다.


결정자

어떤 애트리뷰트의 값은 다른 애트리뷰트의 값을 고유하게 결정할 수 있다. ex) 사원번호는 사원 이름을 고유하게 결정하지만, 주소는 사원 이름을 고유하게 결정하기 못한다. 결정자는 A->B로 표기하며 "A가 B를 결정한다" 는 의미를 지닌다.



위 릴레이션에서 사원번호->사원이름, 사원번호->주소, 사원번호->전화번호 , (사원번호 , 부서번호) -> 직책 , 부서번호->부서이름 관계가 성립한다.

이 때 A가 B의 결정자이면 B가 A에 함수적으로 종속된다고 말한다. 


완전 함수적 종속성(Full Functional Dependendy)

주어진 릴레이션에서 애트리뷰트B가 애트리뷰트A에 함수적으로 종속하면서 애트리뷰트 A의 어떤 진부분 집합에도 함수적으로 종속하지 않으면 애트리뷰트 B가 애트리뷰트  A에 완정하게 함수적으로 종속한다고 말한다. 





릴레이션 분해


하나의 릴레이션을 두 개 이상의 릴레이션으로 나누는 것이다. 릴레이션을 분해하면 중복이 감소되고, 갱신이상이 줄어드는 장점이 있지만, 바람직하지 않은 문제들을 포함하여 몇 가지 잠재적 문제를 야기한다. 

-릴레이션 분해 전에는 조인이 필요 없었지만 분해 후 조인이 필요한 경우

-분해된 릴레이션을 사용하여 원래 릴레이션을 재구성하지 못하는 경우


무손실분해

분해된 두 릴레이션을 조인하면 원래의 릴레이션에 들어있는 정보를 완전하게 얻을 수 있는걸 말한다. 여기서 손실이란 분해 후에 조인하여 얻은 결과과 기존 릴레이션을 질의하여 얻은 결과보다 많거나 적은것을 모두 포함한다. 

예시를 살펴보자



기존 학생 릴레이션에서 결정자 목록을 구해보면,

학번->이름, 이메일

이메일->학번, 이름

(학번, 과목번호) -> 학점이다.

이를 기반으로 릴레이션을 분해할 수 있는데 




위와 같이 분해할 수 있다. 

본격적인 정규형을 살펴보자




제 1정규형, 제 2정규형, 제 3정규형, BCNF


제 1정규형

한 릴레이션이 제 1정규형을 만족할 필요충분조건은 릴레이션의 모든 애트리뷰트가 원자값만을 갖는다는 것이다. 다시 말해, 모든 애트리뷰트에 반복 그륩이 나타나지 않으면 제 1정규형은 만족한다. 




과목번호 애트리뷰트의 튜플들은 원자성을 만족하지 않는다. 이를 만족하는 릴레이션은 



위와 같이 반복그륩의 각 원소값마다 하나의 튜플로 만들어 주는 것이다. 
아래와 같은 릴레이션이 있다고 가정해보자.


이 릴레이션에서 갱신이상은 발생하지 않을까?
-수정이상 : 한 학과에 소속된 학생 수 만큼 튜플이 존재할 때, 학과의 전화번호가 중복되므로 학과의 전화번호가 바뀌었다면 해당 학과의 모든 전화번호를 수정해야 데이터베이스 일관성이 유지된다.
-삽입이상 : 한 명의 학생이라도 어떤 학과에 소속되지 않으면 이 릴레이션에는 튜플을 삽입할 수 없다. 학번이 기본키인데, 엔티티 무결성 제약조건에 따라 널 값을 넣을 수 없다.
-삭제이상 : 어떤 과의 마지막 학생을 삭제하면 과에 대한 정보도 날아가버린다. 

왜 이러한 갱신이상이 발생할까? 바로 기본 키에 대한 부분 함수적 종속성이 학생 릴레이션에 존재하기 때문이다. 




제 2정규형

한 릴레이션이 제 2정규형을 만족하기 위해서는 제 1정규형을 만족하면서 어떤 후보 키에도 속하지 않는 모든 애트리뷰트들이 릴레이션의 기본키에 완전하게 함수적으로 종속해야 한다. 따라서 기본 키가 두 개 이상의 애트리뷰트로 구성되었을 경우에만 제 1정규형이 제 2정규형을 만족하는가를 고려할 필요가 있다. 

제 2정규형을 만족하는 릴레이션을 보자.



여기서 발생하는 갱신이상을 살펴보자.
-수정이상 : 여러 학생이 소속된 학과의 전화번호가 변경되었을때 학과에 속한 모든 학생들의 튜플의 전화번호를 수정해야 한다.
-삽입이상 : 어떤 학과를 신설해서 아직 소속 학생이 없으면 학과의 정보를 입력할 수 없다. 기본키의 엔티티 무결성 제약조건에 따라 널 값을 입력할 수 없기 때문.
-삭제이상 : 어떤 학과의 마지막 학생을 삭제하면 학과의 전화번호도 삭제된다. 

제 2정규형에서 갱신이상이 발생하는 이유는 이행적 종속성이 존재하기 때문이다.
 


제 3정규형

한 릴레이션이 제 3정규형을 만족하기 위해서는 릴레이션이 제 2정규형을 만족하면서, 키가 아닌 모든 애트리뷰트가 릴레이션의 기본 키에 이행적으로 종속하지 않는것이다.

제 3정규형을 만족하는 릴레이션의 예시를 보자. 



이 릴레이션에 존재하는 함수적 종속석은 다음과 같다. 



각 학생은 여러 과목을 수강할 수 있고, 각 강사는 한 과목만 가르친다. 키가 아닌 강사 애트리뷰트가 기본 키에 완전하게 함수적으로 종속하므로, 제 2정규형을 만족하고, 키가 아닌 강사 애트리뷰트가 기본 키에 직접 종속하므로 제 3정규형도 만족한다. 

그러나 역시 갱신이상이 발생한다.

-수정이상:여러 학생이 수강중이 어떤 과목의 강사가 변경된다면, 그 과목을 수강하는 모든 학생의 강사를 수정해야 한다.

-삽입이상:어떤 과목을 신설하여 아직 수강하는 학생이 없으면 어떤 강사가 그 과목을 가르친다는 정보를 입력할 수 없다.(엔티티 무결성 제약 조건 위반)

-삭제이상:어떤 과목을 이수하는 학생이 1명일 때 이 학생을 삭제하면 강사에 대한 정보도 날라간다.


갱신이상이 생기는 이유는 키가 아닌 애트리뷰트가 다른 애트리뷰트를 결정하기 때문이다. 위 릴레이션의 후보키는(학번,과목) , (학번, 강사)이다.



BCNF

한 릴레이션이 BCNF를 만족하기 위해선 제 3정규형을 만족하면서, 모든 결정자가 후보키여야 한다. 따라서 하나의 후보 키만을 가진 릴레이션이 제 3정규형을 만족하면,

동시에 BCNF도 만족한다. 위 예시에서 BCNF를 만족하는 릴레이션을 살펴보자. 



이처럼 결정자 역할을 했던 애트리뷰트를 기본키 삼아 릴레이션을 분해하여 해결한다. 그리고 그 결정자는 기존 릴레이션의 외래키가 된다.
정규형을 요약하는 그림을 살펴보자.



'컴퓨터공학 > 데이터베이스' 카테고리의 다른 글

트랜잭션  (0) 2018.10.31
뷰(VIEW)  (0) 2018.10.31
데이터베이스의 인덱스  (0) 2018.10.28
SQL  (0) 2018.10.28
관계 데이터 모델과 제약조건  (0) 2018.10.27
데이터베이스 시스템 개요  (0) 2018.10.27