[CS] 데이터베이스 - 릴레이션 정규화

두두·2023년 12월 5일

정규화 개요

‼️ 부주의한 데이터베이스 설계는 제어할 수 없는 데이터 중복을 야기하여 여
러 가지 갱신 이상(update anomaly)을 유발함

→ 어떻게 좋은 데이터베이스 설계를 할 것인가?
→ 데이터베이스에 어떤 릴레이션들을 생성할 것인가?
→ 각 릴레이션에 어떤 애트리뷰트들을 둘 것인가?

✅ 정규화(normalization)는 주어진 릴레이션 스키마를 함수적 종속성과 기본 키를 기반으로 분석하여, 원래의 릴레이션을 분해함으로써
중복과 세 가지 갱신 이상을 최소화함

갱신 이상

수정 이상(modification anomaly)

반복된 데이터 중에 일부만 수정하면 데이터의 불일치가 발생

삽입 이상(insertion anomaly)

불필요한 정보를 함께 저장하지 않고는 어떤 정보를 저장하는 것이 불가능

삭제 이상(deletion anomaly)

유용한 정보를 함께 삭제하지 않고는 어떤 정보를 삭제하는 것이 불가능



릴레이션 분해

하나의 릴레이션을 두 개 이상의 릴레이션으로 나누는 것

장점

중복이 감소
갱신 이상이 줄어듦

‼️ 반면,

바람직하지 않은 문제들을 포함하여 몇 가지 잠재적인 문제들을 야기할 수 있음
➡️ 릴레이션이 분해되기 전에는 조인이 필요 없는 질의가
분해 후에는 조인 을 필요로 하는 질의로 바뀔 수 있음
➡️ 분해된 릴레이션들을 사용하여 원래 릴레이션을 재구성하지 못할 수 있음

무손실 분해(lossless decomposition)

  • 분해된 두 릴레이션을 조인하면 원래의 릴레이션에 들어 있는 정보를 완전
    하게 얻을 수 있음.
  • 여기서 손실이란 정보의 손실을 뜻함



제1정규형

한 릴레이션 R이 제1정규형을 만족할 필요 충분 조건
= 릴레이션 R의 모든 애트리뷰트가 원자값만을 갖는다는 것

즉, 릴레이션의 모든 애트리뷰트에 반복 그룹(repeating group)이 나타나지
않으면 제1정규형을 만족함

예시.
1️⃣ 반복 그룹 애트리뷰트에 나타나는 집합에 속한 각 값마다 하나의 투플로 표현

2️⃣ 모든 반복 그룹 애트리뷰트들을 분리해서 새로운 릴레이션에 넣음. 원래 릴레
이션의 기본 키를 새로운 릴레이션에 애트리뷰트로 추가함



제2정규형

한 릴레이션 R이 제2정규형을 만족할 필요 충분 조건
== 릴레이션 R이 제1정규형을 만족하면서, 어떤 후보 키에도 속하지 않는 모든 애트리뷰트들이 R의 기본 키에 완전하게 함수적으로 종속하는 것
✅ 기본 키가 두 개 이상의 애트리뷰트로 구성되었을 경우에만 제1정규형이 제
2정규형을 만족하는가를 고려할 필요가 있음

제2정규형에 존재하는 갱신 이상

➡️ 그림의 학생1 릴레이션의 기본 키는 한 애트리뷰트인 학번이므로 제2정규
형을 만족함

수정 이상

여러 학생이 소속된 학과의 전화번호가 변경되었을 때 그 학과에 속한 모든
학생들의 투플에서 전화번호를 수정하지 않으면 데이터베이스의 일관성이 유지되지 않음

삽입 이상

어떤 학과를 신설해서 아직 소속 학생이 없으면 그 학과의 정보를 입력할 수
없다. 왜냐하면 학번이 기본 키인데 엔티티 무결성 제약조건에 따라 기본 키 에 널값을 입력할 수 없기 때문

삭제 이상

어떤 학과에서 마지막 학생의 투플이 삭제되면 그 학과의 전화번호도 함께
삭제됨

‼️ 갱신 이상이 생기는 이유

학생1 릴레이션에 이행적 종속성이 존재하기 때문

제3정규형

한 릴레이션 R이 제3정규형을 만족할 필요 충분 조건
== 릴레이션 R이 제2정규형을 만족하면서, 키가 아닌 모든 애트리뷰트가 릴레이션 R의 기본 키에 이행적으로 종속하지 않는 것

제3정규형에 존재하는 갱신 이상

  • 수강 릴레이션에서 각 학생은 여러 과목을 수강할 수 있고, 각 강사는 한 과
    목만 가르침. 이 릴레이션의 기본 키는 (학번, 과목)
  • 키가 아닌 강사 애트리뷰트가 기본 키에 완전하게 함수적으로 종속하므로
    제2정규형을 만족하고, 키가 아닌 강사 애트리뷰트가 기본 키에 직접 종속
    하므로 제3정규형도 만족함
  • 이 릴레이션에는 아래와 같은 함수적 종속성들이 존재함
    (학번, 과목) → 강사
    강사 → 과목

수정 이상

여러 학생이 수강 중인 어떤 과목의 강사가 변경되었을 때 그 과목을 수강하는 모든
학생들의 투플에서 강사를 수정하지 않으면 데이터베이스의 일관성이 유지되지 않음

삽입 이상

어떤 과목을 신설하여 아직 수강하는 학생이 없으면 어떤 강사가 그 과목을 가르친다 는 정보를 입력할 수 없음
왜냐하면 학번이 기본 키를 구성하는 애트리뷰트인데 엔티티 무결성 제약조건에 따라 기본 키를 구성하는 애트리뷰트에 널값을 입력할 수 없기 때문

삭제 이상

어떤 과목을 이수하는 학생이 한 명밖에 없는데 이 학생의 투플을 삭제하면 그 과목을 가르치는 강사에 관한 정보도 함께 삭제됨

‼️ 갱신 이상이 생기는 이유

  • 수강 릴레이션에서 키가 아닌 애트리뷰트가 다른 애트리뷰트를 결정하기
    때문
  • 이 릴레이션의 후보 키는 (학번, 과목)과 (학번, 강사)

profile
멋쟁이가 될테야

0개의 댓글