[데이터베이스] 이상현상과 함수적 종속성(Data Anomalies and Functional Dependency)

Anomaly

Anomaly는 데이터베이스를 안에서 발생하게되는 이상 현상을 의미한다. Anomaly가 데이터베이스에 존재하면 그 데이터베이스는 위험요소가 존재하게 된다. Anomaly 의 종류와 그 위험성은 다음과 같다.

  1. Deletion Anomaly : 테이블에서 어떤 tuple을 삭제하게 되면 해당 tuple 안에 있는 모든 정보가 삭제되기 때문에 발생하는 문제이다.
Student_id Student_name department course_id grade
1 여훈 전전 1 A+
1 여훈 전전 2 A+
1 여훈 전전 3 A+
2 윤이 상사 3 A+
  • 만약 윤이가 course_id 가 3인 수업을 전공을 변경하면서 철회 했다고 하자, 극단적이지만 위 테이블에서는 윤이가 들은 과목이 3번 과목 밖에 없으므로, 의도한 것과는 다르게 윤이의 정보가 통채로 사라지게 된다. 우리는 윤이가 3번 과목을 듣지 않았다고 기록하고 싶을 뿐인데, 윤이라는 학생이 더 이상 존재하지 않는 것 처럼 사라지는 것이다. 이런 현상이 Deletion Anomaly 이다.
  • Insertion Anomaly : 테이블에 새로운 tuple 을 삽입할 때, 특정 attribute의 값이 존재하지 않아 불필요하게 null 값을 삽입해야하기 때문에 발생하는 문제이다.
Student_id Student_name department course_id grade
1 여훈 전전 1 A+
1 여훈 전전 2 A+
1 여훈 전전 3 A+
2 윤이 상사 3 A+
3 현기 null null null
  • 똑같은 표에 새로운 학생 현기를 추가하고 싶다고 하자. 현기는 이제 막 입학했기 때문에, id와 이름만 넣을 수 있고, 다른 모든 정보는 null 로 표기해야 한다.
  • Update Anomaly : 어떤 정보를 업데이트할 때, 그에 대응되는 모든 정보를 다 업데이트 해야하기 때문에 발생하는 문제이다.
Student_id Student_name department course_id grade
1 여훈 전전 ? 1 A+
1 여훈 상사 ? 2 A+
1 여훈 전전 ? 3 A+
2 윤이 상사 3 A+
3 현기 null null null
  • 여훈이가 상사로 전과했다고 해보자, 그런데 문제는 이 과정에서 course_id 2 에 대한 정보만 업데이트 되었다. 그럼 데이터베이스만 보았을 때 여훈이는 어떤 전공을 소속이라고 해야할까? 이를 방지하기 위해 모든 여훈이가 포함된 tuple 을 찾아 업데이트 한다고 해보자. 위 테이블에서는 tuple이 세 개 뿐이니 쉬운 작업이겠지만, 데이터베이스가 큰 경우에는 엄청난 자원과 시간의 낭비가 될 것이다.

Functional Dependency

한글로는 함수적 종속석이라고 한다. 어떤 X가 Y를 함수적으로 결정할 때, 우리는 X를 결정자, Y를 종속자 라고 할 수 있고, 수학적 표기로는 X -> Y 라고 나타낼 수 있다. 수학적인 개념으로는 조금 헷갈리니 디비 테이블로 확인해보자.

Student_id Student_name department course_id grade
1 여훈 전전 ? 1 A+
1 여훈 상사 ? 2 A+
1 여훈 전전 ? 3 A+
2 윤이 상사 3 A+

위에서 사용했던 테이블을 그대로 가져왔다. 어떤 attribute의 집합 X가 특정한 tuple 을 식별하게 한다면, 함수적 종속성 관계에 있다고 할 수 있을 것이다. 이 테이블에서는 우리가 Studentname, courseid 만 알고있다면, 다른 나머지 정보들을 하나로 특정할 수 있다. 그리고 학번을 알면 학생의 이름도 특정할 수 있다. 따라서 위 테이블을 다음과 같은 관계들을 가지고 있다고 할 수 있다.

  1. (Studentid, courseid) -> department
  2. (Studentid, courseid) -> Student_name
  3. (Studentid, courseid) -> grade
  4. Studentid -> Studentname

위 처럼 함수적 종속성은 한 테이블 안에서도 여러개 발견될 수 있다.

Partial Functional Dependency

부분 함수적 종속성은 함수적 종속성을 만드는 attribute의 지합 중에 일부에 함수적 종속성을 가지는 것을 의미한다. 위에서 사용한 예시를 보면 Studentname 은 두 attribute의 집합인 (Studentid, courseid) 에 종속되지만 동시에, 해당 집합에서 Studentid attribute 에 대해서도 종속되는 관계를 가진다. 즉 2번과 4번경우가 동시에 발생한다는 것이다. 이렇게 결정자의 일부에도 종속자가 되는 관계를 Partial Functional Dependency 라고 한다.


전여훈
Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.