공부한 기록/데이터베이스

정규화

YongE 2022. 11. 24. 17:38

이상현상 Anomaly

잘못된 설계를 바탕으로 건축된 건물은 무너질 수 있다. 데이터베이스도 그렇다. 데이터베이스를 잘못 설계한다면 SQL이 불가능하거나, 투플을 삭제할 때 다른 정보도 연쇄 삭제되는 삭제 이상(deletion anomly), 투플 삽입 시에 특정 속성에 해당하는 값이 없어 null값을 입력해야 하는 삽입이상(insertion anomaly), 투플 수정 시 중복된 데이터 일부만 수정되어 불일치가 일어나는 수정이상(update anomaly)이 있을 수 있다.

이런 이상현상은 정규화를 통해 해결할 수 있다. 다만 정규화를 다루기에 앞서 함수종속성에 대해 알아야 한다.

 

함수종속성 Functional Dependency

테이블의 각 속성 사이에는 의존성이 존재한다.

만약 속성 A의 값을 알면 다른 속성 B의 값이 '유일하게' 정해지는 의존관계가 있다고 하자. 이때 "속성 A는 속성 B를 결정한다(determine)" 혹은 "속성 B는 속성 A에 종속한다(dependent)"라고 한다. 이는 A -> B로 표현하며, A는 B의 결정자라고도 한다. 덧붙여서, '유일하게' 정해진다는 것은 반드시 값이 하나여야 한다는 의미다. 절대로 2개 이상이어서는 안된다.

 

종속관계의 표시

위의 내용만 보면 함수종속성에 대해 바로 이해할 수 있다. 릴레이션에 속하는 속성 집합 X,Y가 있을때, X 각각의 값이 Y의 값 한 개와 대응될 때, X는 결정자(determinant)가 되고, Y는 종속속성(dependent attribute)가 된다.

 

함수종속성을 나타내는 함수족송성 다이어그램은 다음과 같이 표현한다. 릴레이션의 속성은 직사각형으로 표현하고, 속성 간의 함수종속성은 화살표로, 복합속성은 직사각형으로 묶는다.

함수종속성 다이어그램

 

정규화

이상현상이 발생한 릴레이션을 분해하여 이상현상을 없애는 과정이다. 문제가 있는 테이블의 함수종속성의 유형에 따라 등급을 구분가능한다. 정규형개념으로 구분가능하다. 물론 정규형이 높을수록 이상현상은 줄어든다.

 

  • 제1정규형

한 릴레이션의 속성값이 원자값(Atomic value, 더 쪼갤 수 없는 값)를 가지는 형태를 말한다.

이상현상이 발생한 테이블이 제1정규형이 되는 과정

 

  • 제2정규형

제2정규형이 되려면 2가지 조건을 만족시켜야 한다. 1. 제1정규형이어야 하고, 2. 기본키가 아닌 속성(nonprime attribute)이 기본키에 완전함수종속이어야 한다.

1번 조건부터 추가적인 설명을 덧붙이면 이렇다. 제1정규형이어야만 제2정규형이 될 수 있다. 제1이 아니면서 제2가 될 수 없는 것이다. 앞으로 나올 제3정규형에서도 제1,2정규형이어야만 제3정규형이 될 수 있다.

2번 조건, 완전 함수 종속(full functional dependency)이란, a와 b가 속성이면서 a->b가 성립할 때, b가 a의 속성 전체에 완전함수종속이면서 부분함수종속이 아닌 경우를 의미한다.

간단한 예시

예시의 학생번호는 성적을 결정할 수 없다. 어느 강좌의 성적인지 모르기 때문이다. 강좌이름 또한 성적을 결정할 수 없다. 누구의 성적인지 알 수 있는 방법이 없다. 따라서 학생번호와 강좌이름 속성을 한 데 묶으면 성적을 온전히 결정할 수 있다. 이것이 FFD 완전함수종속이다.

여기서 추가로 알 수 있는 사실은 기본키가 속성 하나로 이뤄져 있으면 완전함수종속이 된다.

 

위 두 조건을 만족하면 제2정규형이라는 것을 알았다. 그러나 이렇게 단순히 보면 이해하지 못할 수도 있다. 그래서 제2정규형을 알아보는 조건을 세분화해서 설명하겠다.

  1. 후보키를 찾는다.
  2. 기본키를 찾는다.
  3. 기본키나 후보키에 속하지 않는 속성(nonprime attribute)을 찾는다.
  4. nonprime attribute가 기본키에 완전함수종속하는지 알아본다. 하나라도 존재하지 않으면 그것은 제2정규형이 아니다.

그렇다면 어떻게 해야 하는가? 이는 '분해'하면 된다.

학생수강성적 릴레이션

한 릴레이션을 예로 들어보자.

위의 검사순서에 따른 결론

하나라도 부분종속이 존재하므로 제2정규형은 아니라는 결론이 내려졌다.

결론에 따른 분해

이 그림을 보면 어떻게 분해해야 할지 알 수 있다. 다음과 같이 3개의 릴레이션으로 나뉜다.

수강 릴레이션 (학생번호, 강좌이름, 성적)

학생 릴레이션 (학생번호, 학생이름, 학과, 주소, 학과사무실)

강좌 릴레이션 (강좌이름, 강의실)

 

  • 제3정규형

릴레이션이 제2정규형이면서 기본키가가 아닌 속성이 기본키에 비이행적(non-transitive)으로 종속하는 경우를 뜻한다.

비이행적 종속이란 A → B, B → C가 성립할 때 A → C가 성립되지 않는 함수 종속성을 의미한다. A->C가 성립되면 이행적 종속이다.

학생번호는 학과사무실을 함수적으로 결정한다.

위의 예로 든 릴레이션에서 보자. 위 릴레이션은 3개로 나뉘었고 결과적으로 제2정규형까지는 만족한다. 그러나 제3정규형인가? 답은 아니다.

학생번호는 학과를 함수적으로 결정하고, 학과는 학과사무실을 함수적으로 결정한다. 학생번호는 학과사무실을 함수적으로 결정하므로 이행적transitive 종속한다. 

따라서 이때도 릴레이션을 분해하여 해결한다.

학생 릴레이션 (학생번호, 학생이름, 학과, 주소)

학과 릴레이션 (학과, 학과사무실)

 

  • BCNF

릴레이션에서 함수종속성 X->Y가 성립할 때 모든 결정자 X가 '후보키'이면 BCNF정규형이라 한다. 

제3정규형에서 예시로든 이미지를 보면 학과가 학과사무실의 결정자이지만 후보키는 아니다. 따라서 BCNF가 아니다. 

728x90
반응형

'공부한 기록 > 데이터베이스' 카테고리의 다른 글

SQL 고급  (0) 2022.11.30
데이터 모델링  (0) 2022.11.17
SQL (3)  (0) 2022.11.09
SQL 2  (0) 2022.10.26
SQL 1  (0) 2022.10.10