[Database] 정규화

GreenBean·2022년 1월 17일
0
post-thumbnail

정규화

정규화(Normalization)란?

  • 정규화: 이상현상이 발생하는 릴레이션을 분해하여 이상현상을 없애는 과정
  • 이상현상이 있는 릴레이션은 이상현상을 일으키는 함수 종속성의 유형에 따라 등급 구분 가능
  • 릴레이션은 정규형 개념으로 구분하며, 정규형이 높을수록 이상현상은 줄어듬
  • 정규화란 즉 이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하는 과정을 의미
    • 릴레이션은 분해되는 정도에 따라 정규형 단계로 나누어지며 정규형이 높아질수록 이상현상은 줄어듬
  • 정규화의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것
    • 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, 데이터베이스의 저장 용량 역시 줄일 수 있음

제1 정규형

  • 제1 정규형은 릴레이션의 모든 컬럼이 원자값(Atomic Value, 하나의 값)을 갖는 경우
    • 예를 들어 고객 취미들(이름, 취미들)이라는 릴레이션에 (추신호, (영화, 음악))이라는 열이 있다고 가정하면 이 속성들이 각각 다른 열로 분해된 릴레이션을 제1 정규형이라 함

제2 정규형

  • 제2 정규형은 릴레이션이 제1 정규형을 만족하고, 기본키가 아닌 속성이 기본키에 완전 함수 종속일 때를 의미 (=완전 함수 종속을 만족하도록 테이블을 분해하는 것)
    • 여기서 완전 함수 종속이라는 말은 기본키로 묶인 복합키가 존재할 때 복합키(A,B,C)가 모여서 하나의 다른 값(X)를 결정하고 복합키의 부분집합이 결정자가 되면 안된다는 뜻

  • 이 테이블에서 기본키는 (학생번호, 강좌이름)으로 복합키
    • 그리고 (학생번호, 강좌이름)인 기본키는 성적을 결정하고 있음
    • 그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있음
    • 즉, 기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에 위의 테이블의 경우 기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리해야 제2 정규형을 만족시킬 수 있음

제3 정규형

  • 제3 정규형은 릴레이션이 제2 정규형을 만족하고 기본키가 아닌 속성이 기본키에 비이행적(Non-Transitive)으로 종속할 때(직접 종속)를 의미 (=이행적 종속을 없애도록 테이블을 분해하는 것)
    • 여기서 이행적 종속이란, A → B, B → C가 성립할 때 A → C가 성립되는 함수 종속성을 의미

  • 기존의 테이블에서 학생번호는 강좌이름을 결정하고 있고, 강좌이름은 수강료를 결정하고 있음
    • 그렇기 때문에 이를 (학생 번호, 강좌 이름) 테이블과 (강좌 이름, 수강료) 테이블로 분해해야 함
  • 이행적 종속을 제거하는 이유는 비교적 간단
    • 예를 들어 501번 학생이 수강하는 강좌가 스포츠경영학으로 변경되었다고 했을 때, 이행적 종속이 존재한다면 501번의 학생은 스포츠경영학이라는 수업을 20000원이라는 수강료로 듣게 됨
    • 물론 강좌 이름에 맞게 수강료를 다시 변경할 수 있지만 이러한 번거로움을 해결하기 위해 제3 정규화를 하는 것
    • 즉, 학생번호를 통해 강좌이름을 참조하고, 강좌이름으로 수강료를 참조하도록 테이블을 분해해야 함

BCNF 정규형

  • BCNF 정규형은 릴레이션에서 함수 종속성 X → Y가 성립할 때 모든 결정자 X가 후보키인 정규형 (=모든 결정자가 후보키가 되도록 테이블을 분해하는 것)

  • 특강수강 테이블에서 기본키는 (학생번호, 특강이름)
    • 그리고 기본키 (학생번호, 특강이름)는 교수를 결정하고 있음
    • 또한 여기서 교수는 특강이름을 결정하고 있음
    • 그런데 문제는 교수가 특강이름을 결정하는 결정자이지만, 후보키가 아니라는 점
    • 그렇기 때문에 BCNF 정규화를 만족시키기 위해서 위의 테이블을 분해해야 하는데, 다음과 같이 특강신청 테이블과 특강교수 테이블로 분해할 수 있음

무손실 분해

  • 이상현상을 해결하기 위해서는 릴레이션을 분해해야 함
    • 하지만 하나의 릴레이션을 분해할 때 분해 후의 결과와 달라지면 문제가 발생하게 되므로 손실이 없이 릴레이션을 분해해야 함
    • 여기서 릴레이션 R을 R1과 R2로 분해할 때, 다시 조인 연산을 했을 때 데이터 손실이 없는 것 무손실 분해(Loseless-join decomposition)라고 함
    • 그리고 R1과 R2는 R1∩R2 → R1 혹은 R1∩R2 → R2 중 하나를 만족해야 함
      • 아래의 그림에서 교수 속성으로 분리한 후 다시 조인하면 원래의 릴레이션이 되지만 특강이름 속성을 사용하여 분해하는 경우는 창업전략의 교수님이 다르므로 원래의 릴레이션이 되지 않기 때문에 이 경우는 무손실 분해가 아님

Tip!

  • 대부분의 릴레이션에서는 BCNF까지 정규화하면 실제적인 이상현상이 없어지기 때문에 BCNF까지 정규화를 한다고 함

profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글