목차

Database normalization

🗓️

Normalization

  • 정규화는 데이터베이스를 설계한 후 설계 결과물을 검증하기 위해 사용하기도 한다.
  • 잘못 설계된 데이터베이스는 이상현상이 발생할 수 있다.

이상 현상

Insertion anomaly 삽입 이상

  • 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제
  • 위 릴레이션에서 새로운 tuple을 삽입하려면 이벤트번호과 당첨여부까지 삽입해야 하는 이상현상.

갱신 이상

  • 중복 tuple 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제
  • 위 릴레이션에서 tuple중 일부만 수정되어 데이터가 불일치 하게 되는 이상현상이다.

삭제 이상

  • tuple을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제
  • mastawu 고객의 이벤트 참여를 제거하기 위헤 tuple을 삭제하면 고객아이디,이름,등급까지 삭제된다.

정규화의 필요성

  • 이상현상이 발생하는 이유는 관련이 없는 데이터를 하나의 릴레이션에 묶어놨기 때문이다.
  • 이를 방지하려면 관련이 있는 attribute들로만 릴레이션을 구성해야 한다.
  • 정규화는 이상현상이 발생하지 않도록 릴레이션을 관련이 있는 속성들로 구성하기 위해 릴레이션을 분해하는 과정이다.

기본 정규형

  • 정규화의 목표는 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현하는 것이다.
  • 각 정규형마다 만족시켜야 하는 제약조건이 존재한다.
  • 차수가 높은 정규형에 속할수록 데이터 중복이 줄어들고 이상현상이 발생하지 않지만, 제약조건도 그만큼 엄격해진다.
  • 함수 종속관계는 생략하고 정규화를 하고 결과물에 대해서 직접 이야기하는 것으로 의의를 둔다.

제 1 정규형

  • 릴레이션에 속한 모든 attribute의 도메인이 원자값(atomic value)로만 구성 되어 있으면 제 1 정규형에 속한다.
  • 위 릴레이션은 다중 값을 가지고 있다. 제 1정규형에 속하게 하려면 이벤트번호롸 당첨여부를 하나씩만 포함하도록 분해해야 한다.
  • 그러나 1정규형으로 바꿔도 이상현상이 사라지지는 않는다. 앞서 이상현상을 소개하면서 3가지 이상현상 모두 발생한다.

제 2 정규형

  • 1정규형의 릴레이션을 제2정규형으로 만족하려면 부분 함수 종속을 제거하고 모든 attribute가 기본키에 완전 함수 종속되도록 릴레이션을 분해하는 정규화 과정을 거쳐야 한다.
  • 한마디로 관련이 없는 attribute를 서로 분리하면 된다는 이야기다.
  • 그러나 이렇게 분리되더라도 이상현상이 여전히 존재한다.
  • 고객 릴레이션에서는 고객아이디등급+할인율에 여전히 분리가 필요하다.
  • 삽입이상 : 등급+할인율만 추가하고 싶을 뿐인데 기본키인 고객아이디를 추가해야하는 점이다.
  • 갱신이상 : 등급+할인율가 고객아이디에 종속되어있으므로 등급별 할인율을 조정하게되면 데이터 불일치가 발생할 수 있다.
  • 삭제이상 : 마찬가지로 고객아이디를 제거하면 등급+할인율 역시 같이 삭제된다.

제 3 정규형

  • 릴레이션에서 모든 attribute가 기본키에 종속되지 않도록 릴레이션을 추가적으로 분해하는 과정을 거쳐 제 3정규형을 만든다. (이행적 함수 종속 제거)
  • 고객릴레이션을 등급으로과 분해하면 각각 attribute가 기본키에 하나씩 종속되는 독립 종속이 된다.

BCNF 보이스/코드 정규형

  • 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키면 보이스/코드 정규형에 속한다.
  • 후보키를 여러개 갖고 있는 릴레이션에서 발생할 수 있는 이상현상을 해결하기 위해 3정규형보다 더 엄격한 제약조건을 제시한 것이다.
  • 위 릴레이션은 이상현상을 모두 가지고 있다.

삽입이상 역시 갖고 있다.

  • 고객아이디강좌명에 대해서 하나로 묶고 담당강사번호를 기본키로 한 강좌명과 릴레이션으로 묶는다.
  • 이렇게 하면 고객아이디담당강사번호를 기본키로 사용하는데 문제가 없고 강좌명이 묵인 릴레이션의 경우에도 담당강사번호가 기본키가 되어 요구조건에도 만족할 수 있다.