asdfsdaaf

 

잘못된 데이터 베이스의 설계

  • 정보의 중복
  • 특정 정보의 표현 불가능
  • 정보의 손실

 

잘못된 데이터 설계의 결과

  • 수정 이상
    • 갱신 이상 : 반복된 데이터 중 일부만 수정하면 데이터의 불일치가 발생
    • 삽입 이상 : 불필요한 정보를 함꼐 저장하지 않고는 어떤 정보를 저장하는 것이 불가능
    • 삭제 이상 : 유용한 정보를 함께 삭제하지 않고는 어떤 정보를 삭제하는 것이 불가능

 

제1 정규형

* 모든 애트리뷰트의 값이 하나만 들어가 있는 릴레이션의 형태
왜? 집합이기 때문에
(집합이란, 유일한 값들의 모임)

 

  제 2 정규형

 
제 1정규형을 만족하면서 부분 함수의 종속을 제거한 릴레이션의 형태 (= 완전 함수 종속인 상태)
 
여기서 함수의 종속성이라는 개념이 정말 중요한데 한 개의 릴레이션을 예로 들어본다.
 

 

 

 

* 데이터 베이스의 키 = 모든 애트리뷰트들을 구분할 수 있는 유일하게 구별해야 하는 최소한의 애트리뷰트 집합

* 결정자 = 임의의 애트리뷰트를 구분할 수 있는 다른 애트리뷰트의 집합

 

여기서 함수의 개념이 중요한데

 

y = x라고 해보자. 이건 함수이다. 왜? x의 값에 어떤 수를 넣어도 y값이 나오니까.

수학의 함수가 아니라 funtion()의 역할은 하는 함수를 말하는 것이다. 간단한 함수를 만들어보자.

 

// 꽃댕댕 int out(int a, int b){ return a+b; }

여기서 a, b의 어떤 값을 집어 넣었으면 return을 해서 어떤 값을 얻어낼 수 있다.

 

 

#함수적 종속성

  완전 함수적 종속성

-) 저 위의 애트리뷰트를 보자면 a, b의 역할(y = x 에서는 x)에 해당하는 것이 사원번호, 부서번호인 것이다. 두개의 애트리뷰트를 위에 out이라는 함수처럼 임의의 함수에 넣으면 어떤 값을 얻어낼 것이라고 기대할 수 있다. 우리가 기대할 수 있는 값은 사원이름, 주소, 전화번호, 직책, 부서이름(y = x 에서는 y)의 역할에 해당하는 것이다. 결정자로 모든 애트리뷰트를 구할 수 있다. 그리고 결정자는 하나여야 한다. 이걸 완전 함수적 종속성이라고 한다.

 

그렇다면 뭐가 문제가 되는 것일까? 튜플에서 결정자는 하나여야 하지만, 여러 개가 있을 때 문제가 된다.

 

여기서 키 값은 사원번호, 부서번호를 제외한 애트리뷰트를 이용해서 다른 애트리뷰트 값을 구할 수 없어야 하는데 구할 수 있다는 말이다. 무슨 말일까?

 

완전 함수적 종속성

사원번호, 부서번호 -> 사원이름, 주소, 전화번호, 직책, 부서번호, 부서이름

이렇게 구할 수 있다는 건 알았다.

 

근데 굳이 저 둘을 쓰지 않고 사원이름을 구할 수 있는 결정자가 있지 않을까?

있다. 뭐? 사원번호

 

 

#겹치는 결정자

  사원이름을 구하는 방법

1 ) 사원번호, 부서번호 -> 사원이름 // 결정자가 {사원번호, 부서번호}인 집합이다.

 

2 ) 사원번호 -> 사원이름 // 결정자가 {사원번호}인 집합이다.

 

 

위에서 말했다. 튜플에서 결정자는 하나여야 한다고. 하지만 결정자가 2개가 되기 때문에 문제가 되는 것이다.

 

그럼 부서번호를 구하려면?

1 ) 사원번호, 부서번호 -> 부서이름 // 결정자가 {사원번호, 부서번호}인 집합이다.

2 ) 부서번호 -> 부서이름 // 결정자가 {부서번호}인 집합이다.

 

그렇다면 직책을 구하려면?

 

1 ) 사원번호, 부서번호 -> 직책

 

 

 

사원번호 -> 사원이름, 주소, 전화번호

부서번호 -> 부서이름

이렇게 값을 도출해 낼 수 있다는 거지. 이걸 부분적 함수 종속성이라고 부른다. 그림으로 나타내면

 

그렇다면 여기서 부분 함수적 종속성을 제거해 주기 위해서 이렇게 나눠볼 수 있다.

 

사원번호-> 사원이름, 주소, 전화번호 

부서번호-> 부서이름

사원번호, 부서번호 -> 직책

 

 

이렇게 되면 제 2정규화의 목적인 부분 함수적 종속성을 제거한 것이다.

 

만약

 

다시 정의와 예시를 살펴 보자.

 

* 결정자 = 임의의 애트리뷰트를 구분할 수 있는 다른 애트리뷰트의 집합

#겹치는 결정자

  사원번호를 구하는 방법

1 ) 사원번호, 부서번호 -> 사원이름 // 결정자가 {사원번호, 부서번호}인 집합이다.

 

 

 

 

2 ) 사원번호 -> 사원이름 // 결정자가 {사원번호}인 집합이다.

 

라고 했다.

 

그림7.22에서 {A, B} -> {C}이다. 추가적으로 {C}->{B}이다. 그렇다면 이런 경우 제 2 정규형을 만족하는 것일까 아닐까? 답은 '예'.

 

왜?

{C}->{B} 에서 {C}는 결정자(임의의 애트리뷰트를 구분할 수 있는 다른 애트리뷰트의 집합)의 애트리뷰트의 집합이 아니기 때문에 제 2정규형을 만족하는 테이블이 되는 것이다.

 

#

  제 3 정규형

 
제 2정규형을 만족하고 이행적 함수 종속성을 제거한 형태.
 

이행적 함수적 종속성을 한마디로 얘기하면 형이 거기서 왜나와? 이런 것이다.

나랑 직접 관계없는 데이터가 같은 튜플안에 있는 것이다.

 

예를 들어 나와 고등학교 친구인 A가 있다. A의 대학교 지인인 B가 있다. 나는 A를 통해서 B라는 사람을 알수 있는 것이다. 하지만 나는 A를 통해 B를 아는 거지 나와 B와의 직접적인 연관은 없다.

 

A→B B→C 그러므로 A이런거다.

 

그럼 여기서 릴레이션으로 분해 한다면

학번 -> 학과이름을 구분할 수 있는 결정자

학과이름을 구분할 수 있는 결정자 -> 학과이름, 전화번호

학번, 과목번호 -> 학점

(여러 개의 방법 중 하나만 만든 것이다.)

 

 

그럼 그림에서는 나는 학과를 다니기 때문에 학과전화번호를 아는 거지만 그렇게 강한 연결은 아니다.

(단, 여기서 학생은 여러 학과를 다니지 않는다는 전제하에 있는 것이다.

여러 학과를 다닐 경우 함수적 종속 관계가 아니다.)

 

 

 

#분류

  BCNF

 
제 3정규형을 만족하며 키급이 아닌 애트리뷰트가 결정자 역할을 하는 것을 제거함.
*즉 모든 결정자가 후보키여야 한다는 것이다.

(단, 강사는 여기서 한 개의 과목만 가르친다고 가정한다.)

 

여기서 이런 문제가 발생한다.

 

 

(a)번 에 대한 문제가 발생합니다.

C는 키도 아닌데 결정자 역할을 하는 것이다. 여기서 문제가 됩니다.

 

수강 릴레이션에서 학번과 과목명을 알면 강사이름을 알 수 있는데, 강사이름을 알아도 과목명을 알 수 있다는 것입니다.

키가 아닌 것은 함수적 종속성이 있으면 안된다. 그래서 수강 릴레이션에서 수강1 수강2으로 분해하는 것입니다.

 

 


 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band