티스토리 뷰

이상현상

  • 불필요한 데이터 중복으로 인해 릴레이션에 대한 데이터 삽입, 수정, 삭제 연산을 수행할 때 발생할 수 있는 부작용

정규화

  • 이상현상을 제거하면서 데이터베이스를 올바르게 설계해 나가는 과정

이상현상 종류

  • 삽입이상 : 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제
  • 갱신이상 : 중복 투플 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제
  • 삭제이상 : 투플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제
예시

{학번, 수업, 가격} 투플을 갖는 수강 테이블이 존재한다고 가정.

class Table;

100, c, 10000
101, java, 20000
102, python, 30000
103, c#, 40000

삭제이상 발생

  1. 100번 학생이 c 수업을 취소하여 해당 투플을 삭제하였다.
  2. 해당 투플이 삭제됨으로 인해 c수업의 가격인 10000원 또한 같이 정보가 삭제되었다.

-> 원치않는 정보까지 같이 삭제됨

 

삽입이상 발생

  1. kotlin 수업이 새로 개설되었지만 듣는 학생이없어서 {NULL, kotlin, 50000} 투플이 추가되었다.
  2. 수업을 듣는 학생을 조회할 때
    • SELECT count(*) FROM class; 를 할 경우 5명이 조회된다.
    • SELECT count(학번) FROM class; 를 할 경우 4명이 조회된다.
    • SELECT count(*) FROM class WHERE sid IS NOT NULL;을 할 경우 4명이 조회된다.
  3. 위와 같이 데이터에 NULL이 포함된 경우 불안정한 결과를 낳는다.

 

수정이상 발생

  1. c수업을 수강하는 104번 학생이 추가되었다. INSERT INTO class VALUES (104, c, 10000);
  2. c수업의 수강료가 수정되었다.
    • UPDATE class SET 수강료=15000 WHERE 수업='c'; 과 같이 수정하면 c수업의 수강료가 전부 바뀜
    • UPDATE class SET 수강료=15000 WHERE 수업='c' and 학번=104; 와 같이 수정하면 해당 수업의 수강료만 바뀐다.
  3. 일관된 데이터를 제공하지 못하는 문제가 발생한다.

 

-> 이러한 문제를 해결하기 위해 정규화를 하게 된다.

  • 이상현상이 발생하지 않도록, 릴레이션을 관련있는 속성들로만 구성하기 위해 릴레이션을 분해 (decomposition)하는 과정
  • 함수적 종속성을 판단해서 정규화를 수행한다.

함수적 종속성 (Functional Dependency)

  • 속성들 간의 관련성
  • 함수적 종속성을 이용하여 릴레이션을 연관성 있는 속성들로만 구성되도록 분해하여 이상 현상이 발생하지 않는 바람직한 릴레이션으로 만들어 나가는 과정이 정규화
함수 종속이란?

어떤 속성값 A를 알면 다른 속성 B의 값이 유일하게 정해지는 의존 관계를 말한다. 이를 "속성 B는 속성 A에 종속한다", "속성 A는 속성 B를 결정한다", "A -> B", "A는 B의 결정자"라고 한다.

함수 종속 관계를 판단 시 유의 사항
  • 속성 자체의 특성과 의미를 기반으로 함수 종속성을 판단해야한다.
  • 현재 인스턴스만을 가지고 판단하는 것이 아니라 속성이 갖는 의미를 가지고 판단해야한다.
  • 일반적으로 기본키와 후보키는 릴레이션의 다른 모든 속성들을 함수적으로 결정한다.

예시

위와 같은 릴레이션이 존재할 경우

  • 함수적 종속 관계
    • 학생번호 -> 학생이름, 학생번호 -> 주소, 학생번호 -> 학과
      학과 -> 학과 사무실
      강좌이름 -> 강의실
      (학생번호, 강좌이름) -> 성적
  • 그렇지 않은 것 :
    학생이름 -> 학과, 학생이름 -> 주소​

완전 함수 종속 (Full Functional Dependency)

  • 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만, 속성 집합 X의 전체가 아닌 일부분에는 종속되지 않음을 의미한다.
  • 일반적으로 함수 종속 == 완전 함수 종속을 의미한다.
  • 위에서 성적은 (학번번호 & 강좌이름) 에 완전 함수 종속하는 것으로 둘중 하나가 없다면 종속관계가 깨지게 된다.

부분 함수 종속 (Partial Functional Dependency)

  • 릴레이션에서 속성 집합 Y가 속성 집합 X의 부분집합에도 함수적으로 종속됨을 의미한다.
  • (학번, 이름) -> 학과 관계는 부분함수 종속으로 "학번"으르도 학과를 결정할 수 있기 때문이다.

이행적 함수 종속 (Transitive FD)

  • 릴레이션을 구성하는 3개의 속성 집합 X, Y, Z에 대해 함수 종속 관계가
    X -> Y, Y -> Z가 존재한다면 논리적으로 X -> Z도 성립되는데 이러한 관계를 Z가 X에 이행적으로 함수 종속되었다고 한다.
  • 예시 테이블에서 학번 -> 학과 & 학과 -> 학과사무실 관계를 통해 학과사무실은 학번에 이행적으로 함수 종속되는 것이다.
    따라서 학번 -> 학과사무실 관계가 가능하다.
반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday