잘못 설계된 데이터베이스가 어떤 이상현상(anomaly)
삭제이상(deletion anomaly)
튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상 - > 연쇄삭제(triggered deletion)문제 발생
삽입이상(insertion anomaly)
튜플 삽입시 특정 속성에 해당하는 값이 없어 NULL값을 입력해야 하는 현상 -> NULL값 문제 발생
수정이상(update anomaly)
튜플 수정 시 중복된 데이터의 일부만 수정되어 데이터의 불일치 문제가 일어나는 현상 -> 불일치(inconsistency)문제 발생
1.2 이상현상의 예
예시) summer 테이블 생성
삭제이상
삽입이상
수정이상
테이블의 구조를 수정하여 이상현상이 발생하지 않는 사례
삭제이상 없음
삽입이상 없음
수정이상 없음
'A -> B'로 표기하며, A를 B의 결정자라고 한다.
학생이름 : 박지성 -> 강좌이름 : 데이터베이스, 자료구조 -> 함수적 종속성을 만족하지 않는다.
학생수강성적 릴레이션에서 종속관계에 있는 예
학생번호 -> 학생이름
학생번호 -> 주소
강좌이름 -> 강의실
학과 -> 학과사무실
종속하지 않는 예
학생이름 -> 강좌이름
학과 -> 학생번호
종속성이 이렇게 있으면 안된다.(그래서 종속성을 실세계를 어떻게 반영하느냐의 판단기준이 된다.)
종속하는 것처럼 보이지만 주의 깊게 보면 그렇지 않은 예
학생이름 -> 학과(동명이인을 생각해보면 같은 이름의 사람이 학과가 다를 수도 있다.)
함수종속성(FD, Functional Dependency)
릴레이션 R과 R에 속하는 속성의 집합 X,Y가 있을 때, X 각각의 값이 Y의 값 한 개와 대응이 될 때 'X는 Y를 함수적으로 결정한다'라고 하고 X->Y로 표기한다. 이때 X를 결정자(determinant)라고 하고 , Y를 종속 속성(dependent attribute)이라고 한다. 함수 종속성은 보통 릴레이션 설계 때 속성의 의미로부터 정해진다.
함수 종속성 다이어그램(functional dependency diagram)은 함수 종속성을 나타내는 표기법이다.
릴레이션의 속성: 직사각형
속성 간의 함수 종속성: 화살표
복합속성: 직사각형으로 묶어서 그린다.
X,Y,Z가 릴레이션 R에 포함된 속성의 집합이라고 할 때, 함수 종속성에 관한 다음과 같은 규칙이 성립된다.
부분집합(Subset)규칙 if Y ⊆ X, then X → Y
증가(Augmentation) 규칙 if X → Y, then XZ → YZ (XZ 속성 X,Z의 합집합)
이행(Transitivity) 규칙 if X → Y and Y → Z, then X → Z
위 세 가지 규칙으로부터 부가적으로 다음의 규칙을 얻을 수 있다.
결합(Union) 규칙 if X → Y and X → Z, then X → YZ
분해(Decomposition) 규칙 if X → YZ, then X → Y and X → Z
유사이행(Pseudotransitivity) 규칙 if X → Y and WY → Z, then WX → Z
릴레이션의 함수 종속성을 파악하기 위해서는 우선 기본키를 찾아야한다.
기본키가 함수 종속성에서 어떤 역할을 하는지 알면 이상현상을 제거하는 정규화 과정을 쉽게 이해할 수 있다.
함수 종속성과 기본키
릴레이션 R(K, A1, A2, A3, ..., An)에서 K가 기본키면, K → R이 성립. 즉 기본키는 릴레이션의 모든 속성에 대해 결정자(determinant)이다.
예) 이름이 같은 학생이 없다고 가정하면, '이름 -> 학과, 이름 -> 주소, 이름 -> 취득학점'이므로 '이름 -> 이름, 학과, 주소, 취득학점'이 성립한다. 즉 이름 속성이 학생 릴레이션의 전체를 결정한다.
이상현상은 한 개의 릴레이션에 두 개 이상의 정보가 포함되어 있을 때 나타난다.
기본키가 아니면서 결정자인 속성이 있을 때 발생한다.
학생수강성적 릴레이션의 경우 학생 정보 (학생번호, 학생이름, 주소, 학과)와 강좌정보(강좌이름, 강의실)가 한 릴레이션에 포함되어서 이상현상이 나타난다. (학과, 학생번호, 강좌이름은 기본키가 아니면서 결정자인 예이다 여기서는 학생번호, 강좌이름이 같이 묶여야 기본키에 해당)
이상현상을 없애려면 릴레이션을 분해해야하고 위와 같이 (학생, 학과사무실) 속성을 학생수강성적 릴레이션에서 분리해야한다.
학생수강성적 릴레이션에서 부분 릴레이션을 분해하기
분해할 때 부분 릴레이션의 결정자는 원래 릴레이션에 남겨두어야 한다. 그래야 분해된 부분 릴레이션이 원래 릴레이션과 관계를 형성할 수 있다.
1단계: 학생수강성적 릴레이션에서 (강좌이름, 강의실)을 분리
학생수강성적1(학생번호, 학생이름, 학과, 주소, 강좌이름, 성적, 학과사무실)
강의실(강좌이름, 강의실)
2단계: 학생수강성적1 릴레이션에서 (학생번호, 강좌이름, 성적)을 분리
학생학과(학생번호, 학생이름, 학과, 주소, 학과사무실)
학생성적(학생번호, 강좌이름, 성적)
강의실(강좌이름, 강의실)
3단계: 학생학과 릴레이션에서 (학과, 학과사무실)을 분리
학생(학생번호, 학생이름, 학과, 주소)
학과(학과, 학과사무실)
학생성적(학생번호, 강좌이름, 성적)
강의실(강좌이름, 강의실)
함수 종속성은 보통 릴레이션을 설계할 때 속성의 의미로부터 정해지지만, 역으로 릴레이션에 저장된 속성 값으로부터 추정할 수 있다.
[풀이]
결정자가 한 개인 경우 : B → C, C → B, D → A, D → B, D → C
결정자가 두 개인 경우 :
AB → C (B → C 이므로 AB → C 는 함수종속성 규칙에서 당연히 성립한다.)
AB → D
AC → B (함수종속성 규칙에서 당연히 성립)
AC → D
AD → B (함수종속성 규칙에서 당연히 성립)
…
결정자가 세 개인 경우 : ABC → D (함수종속성 규칙에서 당연히 성립) … 등
정답은 당연히 성립하는 것들을 제외한 다음 규칙만 적어주면 된다.
B → C, C → B, D → A, D → B, D → C, AB → D, AC → D
정규화란?
이상현상이 발생하는 릴레이션을 분해하여 이상현상을 없애는 과정
이상현상이 있는 릴레이션은 이상현상을 일으키는 함수 종속성의 유형에 따라 등급을 구분 가능하다.
릴레이션은 정규형 개념으로 구분하여, 정규형이 높을수록 이상현상은 줄어든다.
제 1 정규형으로 변환
고객 취미들(이름, 취미들) 릴레이션을 고객 취미(이름, 취미) 릴레이션으로 바꾸어 저장하면 제 1정규형을 만족한다.
제 2정규형
수강강좌 릴레이션에서 이상현상을 일으키는 (강좌이름, 강의실)을 분해함
제 3정규형
릴레이션 R이 제 2정규형이고 기본키가 아닌 속성이 기본키에 비이행적 non-transitive으로 종속할 때(직접종속) 제 3정규형이라고 한다.
이행적 종속이란 A → B, B → C가 성립할 때 A → C가 성립되는 함수 종속성이다.
이런 이행적 종속을 분해를 해 줘야 한다.
제 3정규형으로 변환
계절학기 릴레이션에서 이상현상을 일으키는 (강좌이름, 수강료)를 분해한다.
BCNF
릴레이션 R이 제 3정규형이고 릴레이션 R에서 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키이면 BCNF 정규형이라고 한다.
3차 정규형을 만족하면서 BCNF는 만족하지 않는 경우는 언제일까? 바로 일반 컬럼이 후보키를 결정하는 경우이다.
BCNF 정규형으로 변환
특강수강 릴레이션에서 이상현상을 일으키는 (교수, 특강이름)을 분해한다.
[분해]1의 경우 R1, R2를 다시 조인하면 원래 릴레이션이 된다.
[분해]2의 경우 R3, R4 릴레이션을 다시 조인하면 의미없는 튜플이 생긴다. -> 무손실 분해 조건을 만족하지 못하고 손실(loss) 분해되었기 때문이다.
대부분의 릴레이션은 BCNF까지 정규화하면 실제적인 이상현상이 없어지기 떄문에 보통 BCNF까지 정규화를 진행한다.