데이터베이스 정규화 - 이상현상 & 함수적 종속성

데이터베이스 정규화 - 이상현상 & 함수적 종속성

개요

  • 삽입이상 (Insertion Anomaly), 갱신이상 (Update Anomaly), 삭제이상 (Deletion Anomaly) 설명
  • 함수적 종속성 (Functional Dependency) 에 대해 알아본다.


데이터베이스 정규화가 필요한 이유

데이터베이스를 잘못 설계하면 불필요한 데이터 중복으로 인한 공간낭비를 넘어 부작용을 초래할 수 있다. 이러한 부작용을 이상(Anomaly) 이라고 하는데 이상 현상의 종류로 삽입이상, 갱신이상, 삭제이상이 있다.

학사정보시스템을 예제로한 데이터베이스 설계에서 잘못된 테이블 설계로 인해 나타날 수 있는 이상현상에 대해 살펴보자.

아래 예제에서 한 튜플을 고유하게 식별할 수 있는 속성의 조합은 학번과 과목코드이고 이를 의미하는 STUDENT_ID, COURSE_ID 의 조합을 기본키 로 가지는 테이블이다. 한 학생은 하나의 DEPARTMENT(학부) 에만 속할 수 있다고 가정하자.

STUDENT_ID STUDENT_NM DEPARTMENT COURSE_ID GRADE
20800399 야붕 컴퓨터공학부 CSE011101 A+
20800399 야붕 컴퓨터공학부 CSE022202 A
20800399 야붕 컴퓨터공학부 CSE033303 B+
21300758 모찌 경영학부 MEC011101 F
21400001 팥빵 기계공학부 POD032939 C+


삽입이상 (Insertion Anomaly)

아직 수업을 하나도 수강하지 않은 학생이 있다고 가정하자. 현재 KEY 를 학번과 과목코드로 지정해 놓았고 기본키로 쓰이는 컬럼은 NULL 이 될 수 없으므로 그 학생은 이 테이블에 추가 될 수가 없다. 굳이 삽입하려면 ‘미수강’ 같은 과목코드를 새로 만들어서 삽입해야 한다.

새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제를 삽입이상 이라고 한다.


갱신이상 (Update Anomaly)

야붕이 컴퓨터공학이 싫어서 음악학부로 옮기게 되는경우 ‘컴퓨터공학부’ 의 갯수는 과목코드의 갯수만큼 있으므로 모두 ‘음악학부’ 로 변경해주어야 한다. 이때 모두 변경하지 않고 두개만 바꾸는 경우 야붕은 컴퓨터공학부인지 음악학부인지 알 수 없게 된다.

중복 튜플 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제를 갱신이상 이라고 한다.


삭제이상 (Deletion Anomaly)

위 테이블에서 모찌는 현재 1개의 과목(MEC011101) 만 수강하고 있다. 모찌가 수강정정기간에 MEC011101 라는 수업을 듣기 싫어져서 드랍하는 경우, 위 테이블에 반영하기 위해서는 모찌에 대한 행을 모두 삭제하게 된다. 수강취소를 반영하기 위해 학생등록정보를 모두 날리게 되는 것이다.

튜플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제를 삭제이상 이라고 한다.


위와 같은 이상현상들이 발생하는 이유는 정규화가 되어 있지 않은 테이블 설계 때문이다. 코딩할 때에도 관심사를 분리하면 코드의 재사용성과 유지보수의 편의성이 높아지는 것처럼 데이터베이스 설계에서도 비슷한 원칙이 적용된다. 데이터베이스 설계의 경우 관심사를 분리하지 않아 생기는 문제는 코드단에서의 문제보다 훨씬 치명적이다.

이론적으로는 정규화를 수행하려면 속성들간의 관련성을 파악해야 하는데, 이 속성들간의 관련성을 함수적 종속성(Functional Dependency) 라고 한다. 일반적으로 하나의 릴레이션에는 하나의 함수적 종속성만이 존재하도록 정규화를 하게 된다.


함수적 종속성 (Functional Dependency)

함수적 종속성은 아래와 같이 표현할 수 있다.

X -> Y

  • X 는 결정자, Y 는 종속자라고 한다.
  • X 가 Y 를 함수적으로 결정한다.
  • Y 가 X 에 함수적으로 종속되어 있다.


예제 1

STUDENT_ID STUDENT_NM DEPARTMENT
20800399 야붕 컴퓨터공학부
21300758 모찌 경영학부
21400001 팥빵 기계공학부

위와 같은 학생 릴레이션을 대상으로 속성 간 함수적 종속성에 대해 알아보자.

학번에 의해서 학생이름과 학부는 고유하게 구분되므로 학생이름, 학부 속성은 학번에 함수적으로 종속되어 있다고 할 수 있다. 여기서 학번은 결정자, 학생이름과 학부는 종속자가 되며 함수적 종속성은 아래와 같은 기호로 표현할 수 있다.

학번 -> (학생이름, 학부)

주의할 점은 현시점의 속성 값만으로 판단하면 안된다. 속성 값은 계속 변할 수 있는 것이기 때문에 속성 자체가 가지는 특성과 의미를 기반으로 판단해야 한다.


예제 2

STUDENT_ID COURSE_ID GRADE STUDENT_NM
20800399 CSE011101 A+ 야붕
20800399 CSE022202 A 야붕
20800399 CSE033303 B+ 야붕
21300758 MEC011101 F 모찌
21400001 POD032939 C+ 팥빵

위 테이블 속성들 간 함수적 종속성은 아래와 같이 정의할 수 있다.

학번 -> 이름
{학번, 과목코드} -> 성적
{학번, 과목코드} -> 이름

  • 이름을 결정짓는 요소는 학번이다.
  • 성적을 결정짓는 요소는 학번과 과목코드이다.
  • 이름은 학번과 과목코드에 의해서도 고유하게 구분될 수 있다.

이름의 경우 해당하는 함수적 종속성이 두개다. 여기서 부분 함수적 종속완전 함수적 종속 을 구분할 수 있다.


부분 함수적 종속 (Partial Functional Dependency)

속성집합 Y 가 속성집합 X 의 전체가 아닌 일부분에도 함수적으로 종속됨을 의미한다.

이름이 속성집합 Y 이고, {학번, 과목코드} 가 속성집합 X 인 상태에서, 이름은 {학번, 과목코드} 에도 함수적으로 종속되며 X 의 일부인 학번에도 함수적으로 종속된다.

완전 함수적 종속 (Full Functional Dependency)

속성집합 Y 가 속성집합 X 전체에 대해서만 함수적으로 종속된 경우를 말한다.

성적이 속성집합 Y 이고, {학번, 과목코드} 가 속성집합 X 인 상태에서, 성적은 {학번, 과목코드} 의 어떤 부분집합에도 함수적으로 종속되어있지 않다. 학번만으로 성적을 결정지을 수 없고, 과목코드만으로도 성적을 결정지을 수 없기 때문이다.

일반적으로 함수적 종속성을 말하면 완전함수종속을 의미한다.

다음 포스팅에서는 1NF, 2NF, 3NF, BCNF 에 대해 정리한다.


Comments

Yaboong's Picture

Yaboong

오스카 쉰들러는 흔해빠진 기회주의자요 부패한 사업가였다. 그러나 거대한 악이 세상을 점령하는 것처럼 보일 때 그 악에 대항해서 사람의 생명을 구한 것은 귀족도 지식인도 종교인도 아닌 부패한 기회주의자 오스카 쉰들러였다.

Seoul, South Korea https://github.com/yaboong