[데이터베이스] 제1, 2 정규형

kkado·2022년 11월 26일
0

데이터베이스

목록 보기
1/4
post-thumbnail

데이터베이스를 공부하며 배운 내용들을 나름의 방식대로 정리합니다.

잘못 설계된 데이터베이스

위의 테이블을 보면, 같은 학번이 나타날 때마다 성명과 학년 정보가 중복하여 나타나고 있다. 이러한 데이터베이스를 잘못 설계된 데이터베이스라고 하고, 삭제, 삽입, 갱신 작업을 할 때 이상 현상(anomaly)가 발생한다.

이상 현상(anomaly)

삭제 이상(deletion anomaly)

만약 위의 테이블에서 '고영준' 학생의 'CO234' 과목을 삭제하려고 하면, 고영준 학생의 학번이 3654이고 4학년이라는 정보 또한 테이블에서 삭제되게 된다.
-> 연쇄 삭제(triggered deletion)에 의해 정보가 손실됨

삽입 이상(insertion anomaly)

만약 위의 테이블에서 학번이 1234이고, 학년이 3인 '홍길동' 이라는 학생을 삽입하고자 할 때, 이 학생이 수강하고 있는 과목이 없어도 등록할 수 있어야 하는데 어떤 과목을 등록하지 않는 한 삽입이 불가능하다. (학번과 과목코드가 기본키이기 때문에)
-> 과목 정보가 없을 때 입력할 수 없는 이상 현상

갱신 이상(update anomaly)

만약 위의 테이블에서 학번이 2587인 학생의 학년을 3에서 4로 변경하려고 할 때, 학번 2587인 튜플 모두를 변경해야 한다. 만약 모든 튜플을 변경하지 않으면 데이터의 모순성이 발생하며 일관성을 잃게 된다.


이러한 이상 현상은 여러 가지 정보를 하나에 릴레이션에 쑤셔박았기 때문에 발생한다. 따라서 속성들 간의 종속성을 분석하여 하나의 릴레이션에는 하나의 종속성만 표현되도록 테이블을 분해하는 작업이 필요하다.

두 개 이상의 릴레이션으로 분해하는 과정을 정규화 (normalization) 이라고 한다.

함수 종속성

각 속성들 간의 종속 관계를 파악하는 것이 데이터베이스의 정규화에서 가장 중요한 부분이라고 할 수 있다.

어떤 속성은 다른 속성이 결정되면 유일하게 결정 된다. 예를 들어서, 학번이 1234 라고 하면 이 학생의 이름 김철수 는 유일무이하게, 고유하게 결정된다.

이 때 학번 속성을 결정자(determinant) 라고 하고, 이름 속성은 종속자(dependant) 라고 한다. 그리고 이름 속성은 학번 속성에 함수 종속(Functional Dependancy) 이라고 한다.

기호로는 학번 -> (이름) 으로 표시한다.

즉 함수 종속이란 어떤 릴레이션에서 속성 A의 값 각각에 대해 속성 B의 값이 오직 하나만 연관되어 있는 관계를 말한다. (어떤 정의역에 대해서 하나의 함숫값만을 갖는 함수의 정의 생각)

함수 종속 다이어그램(FD Diagram)

이러한 함수 종속 관계를 이해하기 쉽도록 도식화하여 그림으로 표현한 것을 말한다.

위의 잘못 설계된 데이터베이스에서 함수 종속 관계를 FD Diagram으로 나타내면 다음과 같다.

  • 성명은 학번에 함수 종속이다.
  • 학년은 학번에 함수 종속이다.
  • 성적은 {학번, 과목코드} 에 함수 종속이다.

성적{학번, 과목코드}완전 함수 종속 되었다고 한다.
비슷하게, 성명, 학년학번완전 함수 종속 되었다고 한다.

그러나 성명학년{학번, 과목코드}부분 함수 종속 되었다고 한다.

비정규 릴레이션

제 1정규형(1NF)

릴레이션 R에 속한 모든 도메인이 원자 값만으로 되어 있다면 제 1정규형(1NF, Normal Form) 이라고 한다.

위의 릴레이션을 보면, 중복된 값이 많긴 하지만 모든 도메인이 원자 값으로 되어 있으므로, 이를 제 1정규형(이하 1NF)이라고 할 수 있다.

비정규 릴레이션으로부터 제 1정규형은 쉽게 만들 수 있다. 중복되어 병합된 값들을 모두 펼쳐서 작성하면 된다.

위의 정규형 릴레이션의 종속 관계를 FD Diagram으로 나타내면 다음과 같다.

각 속성 간 함수 종속 관계는 다음과 같다.

  • {학번, 과목코드} -> 성적
  • 학번 -> 성명
  • 학번 -> 지도교수
  • 학번 -> 학과
  • 지도교수 -> 학과

제 1정규형의 anomaly

삽입 이상

만약 학번이 9876인 학생 '홍길동' 이 지도교수를 '김용주' 로 하여 릴레이션에 입력하려고 하는데, 어떤 과목에 등록하지 않는 한 이 릴레이션에 입력될 수 없다. 기본키인 과목코드가 NULL 값일 수 없기 때문이다.

삭제 이상

만약 학번이 '3654'인 고영준 학생의 CO234 과목을 수강 취소한다고 할 때, 해당 튜플이 이 릴레이션에서 삭제되면 고영준의 지도교수가 김재현이라는 정보가 삭제되고 학과가 경영이라는 정보까지 함께 삭제된다.

즉, 고영준의 과목 수강 정보만 삭제하고 싶었지만 더이상 위의 릴레이션에서 고영준의 학과나 지도교수를 확인할 수 없게 된다.

갱신 이상

만약 학번이 '4653' 인 조민수 학생의 지도교수를 변경하고자 할 때, 성명이 조민수 인 4개의 튜플에 대해서 모두 변경을 해야 한다. 만약 일부만 변경된다면 데이터 불일치 문제가 발생한다.


1NF의 이상 현상들은 키가 아닌 속성들이 기본키인 {학번, 과목코드}에 완전 함수 종속되지 않고 부분 함수 종속되기 때문에 발생한다.

두 개의 릴레이션으로 분할하여 부분 함수 종속을 제거 함으로써 제 1정규형의 문제점을 해결할 수 있다.

제 2정규형(2NF)

성명, 학과, 지도교수 속성들이 기본키였던 {학번, 과목코드} 에 완전 함수 종속되지 않아서, 학번만을 기본키로써 가지는 별도의 릴레이션으로 분할 하였다. 그리고 위 릴레이션의 FD Diagram은 다음과 같다.

제 1정규형의 부분 함수 종속을 제거하면 제 2정규형(2NF)이 된다.

제 2정규형의 anomaly

하지만 제 2정규형에서도 anomaly가 발생한다.

삽입 이상

'컴퓨터' 학과에 속하는 '홍길동' 교수를 삽입할 수 없다. 학번이 기본키인데 지도하는 학생이 없어서 학번 속성이 NULL이기 때문이다.

삭제 이상

'이영자' 학생과 '김용주' 교수 간의 지도 관계를 끊으려 할 때, '김용주' 교수가 '컴퓨터' 학과 소속이라는 정보가 소실된다.

갱신 이상

만약 '이우정' 교수의 학과를 변경하려고 하면, '이우정' 교수가 지도하는 여러 학생 수만큼 존재하는 모든 튜플들에 대해서 변경해주어야 한다.


위의 이상은 자주 발생하는 상황은 아니지만 두 개의 상이한 정보를 하나의 릴레이션에 혼합하여 표현하려고 하다가 발생한다.

  • 학번 -> 지도교수 (지도교수는 학번에 함수 종속이다.)
  • 지도교수 -> 학과 (학과는 지도교수에 함수 종속이다.)

위 두 개의 함수 종속 관계를 발견할 수 있다. 그리고,

학번 -> 학과 (학과는 학번에 함수 종속이다.)

라는 함수 종속 관계도 존재한다. 즉, 학번이 정해지면, 그 학번의 학생의 지도교수는 유일하므로 지도교수가 정해진다. 지도교수가 정해지면 그 지도교수의 소속 학과 또한 유일하므로 소속 학과 역시 정해진다.

논리적으로 문제는 되지 않지만, 개념적으로는 조금 부자연스럽다.
이렇게, A->B, B->C의 함수 종속 관계가 있을 때 A->C의 함수 종속 관계가 발생하는 상황을 이행적 함수 종속(Transitive FD) 라고 한다.

따라서, 이행적 함수 종속을 제거함으로써 2NF 릴레이션의 anomaly를 해결할 수 있다.

이행적 함수 종속을 제거한 위의 FD Diagram은 제 3정규형인데, 다음 글에서 이어서 작성해 보도록 합시다!!

profile
울면안돼 쫄면안돼 냉면됩니다

0개의 댓글