Database - 이상현상과 정규화

Tae Yun Choi·2023년 5월 21일
0
post-thumbnail

이상현상


이상현상(anomaly)이란 테이블에 튜플을 삽입할 때 부득이하게 NULL 값이 입력되거나 삭제 시 연쇄삭제 현상이 발생하거나, 수정 시 데이터의 일관성이 훼손되는 현상을 말한다

1. 삭제이상

삭제이상이란 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상이다.

→ 연쇄삭제(triggered deletion) 문제 발생

2. 삽입이상

삽입이상이란 튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL 값을 입력해야 하는 현상이다.

3. 수정이상

수정이상이란 튜플 수정 시 중복된 데이터의 일부만 수정되어 데이터의 불일치 문제가 일어나는 현상이다


정규화


이상현상이 발생하는 테이블을 수정하여 정상으로 만드는 과정을 정규화라고 한다.

함수 종속성

정규화를 위해서는 기본키와 함수 종속성에 대해 알아야 할 필요가 있다.

  • 어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 의존 관계
  • ‘속성 B는 속성 A에 종속한다’
  • ‘속성 A는 속성 B를 결정한다’ 라고한다
  • 이런 관계를 ‘A → B’로 표기하며 A는 B의 결정자라고 한다.

Example

학생번호 -> 학생이름
학생번호 -> 주소
강좌이름 -> 강의실
학과 -> 학과사무실

위 예시들은 종속관계에 있는 예시이다.
학번을 알면 학생이름을 바로 알 수 있고,
학번를 알면 주소를 바로 알 수 있다.

반대로 종속하지 않는 예는 다음과 같다

학생이름 -> 강좌이름
학과 -> 학생번호

학생여러개의 강좌를 들을 수 있고,
학과여러명의 학생을 가지고 있기에
종속하지 않는다.

다음 예시는 종속하는 것처럼 보이지만 종속하지 않는다

학생이름 -> 학과
동명이인이 존재할 수 있기에
함수 종속성 존재하지 않는다

정규형의 기본 원칙

  • 자료의 중복성 감소
  • 독립적인 관계는 별개의 릴레이션으로 표현
  • 각각의 릴레이션은 독립적 표현이 가능해야함

1. 제 1정규형

제 1정규형은 릴레이션(테이블)의 속성 값이 원자값이어야 한다는 것이다.
즉, 하나의 속성값만 가져야 한다.
배열 등 불가


2. 제 2정규형

제 2정규형은 릴레이션의 기본키가 복합키일 때, 복합키의 일부분이 다른 속성의 결정자인지 여부를 판단하는 것이다.
즉 기본키가 복합키일 때 기본키의 일부인 속성이 다른 속성을 결정하는 역할을 하면 안된다는 것이다. ( 부분 함수 종속성 제거 )

수강강좌
학생번호강좌이름강의실성적
501데이터베이스공학관 1103.5
401데이터베이스공학관 1104.0
402스포츠경영학체육관 1033.5
502자료구조공학관 1114.0
501자료구조공학관 1113.5

기본키는 (학생번호, 강좌이름)이며, 기본키의 일부인 강좌이름 속성이 강의실을 결정하는 ‘강좌이름 → 강의실’ 종속관계를 가지고 있다.

발생하는 이상현상

  • 삭제이상 : 402번 학생이 수강을 취소하면 스포츠 경영학 과목의 강의실에 대한 정보가 사라짐
  • 삽입이상 : 컴퓨터입문 과목이 개설되어 공학관 112호를 사용하게 되더라도 신청한 학생이 없기에, 학생번호와 성적으로 NULL을 삽입해야 하는 문제가 발생
  • 수정이상 : 데이터베이스 강의실을 공학관 113호로 변경할 경우 데이터 불일치 발생 가능성 있음

따라서 종속관계를 가지고 있는 강좌이름과 강의실을 분해하면 해결된다.

수강
학생번호강좌이름성적
501데이터베이스3.5
401데이터베이스4.0
402스포츠경영학3.5
502자료구조4.0
501자료구조3.5

강의실
강좌이름강의실
데이터베이스공학관 110
스포츠경영학체육관 103
자료구조공학관 111

이런식으로 분해하면 이상현상들이 사라진다.


제 3정규형

제 3정규형은 속성들이 이행적으로 종속되어 있는지 여부를 판단하는 것이다.
이행적 종속이란 A→B, B→C 일 때, A→C인 경우이다
제 3정규형은 이러한 이행적 종속 관계를 제거하는 것이다.

계절학기이므로, 한 학생당 한 강좌만 신청 가능하다고 가정

계절학기
학생번호강좌이름수강료
501데이터베이스20000
401데이터베이스20000
402스포츠경영학15000
502자료구조25000

강의실
강좌이름강의실
데이터베이스공학관 110
스포츠경영학체육관 103
자료구조공학관 111

학생번호 → 강좌이름 → 수강료, 즉, 학생번호로 → 수강료를 결정하는 종속관계로 인해 이상현상 발생

발생하는 이상현상

  • 삭제이상 : 402번 학생이 수강을 취소하면 스포츠 경영학 과목의 강의실에 대한 정보가 사라짐
  • 삽입이상 : 컴퓨터입문 과목이 개설되어 수강료를 삽입해야하는데 신청한 학생이 없기에, 학생번호를 NULL을 삽입해야 하는 문제가 발생
  • 수정이상 : 데이터베이스 수강료를 15000원으로 변경할 경우 데이터 불일치 발생 가능성 있음

학생번호 → 강좌이름, 강좌이름 → 수강료로 테이블 분리하면 이상현상들이 해결된다

계절학기
학생번호강좌이름
501데이터베이스
401데이터베이스
402스포츠경영학
502자료구조
수강료
강좌이름수강료
데이터베이스20000
스포츠경영학15000
자료구조25000

BCNF

릴레이션(테이블)에 존재하는 함수 종속성에서 모든 결정자가 후보키이면 BCNF 정규형이다.
결정자이면서 후보키가 아닌 속성이 존재하면 이상현상이 발생한다

한 학생은 한 개 이상의 특강 신청 가능하고, 교수는 한 특강만 담당한다고 가정

특강수강
학생번호특강이름교수
501소셜네트워크김교수
401소셜네트워크김교수
402인간과 동물승교수
502창업전략박교수
501창업전략홍교수

발생하는 이상현상

  • 삭제이상 : 402번 학생이 수강을 취소하면 인간과 동물 특강을 담당하는 교수 정보가 사라짐
  • 삽입이상 : 최교수가 취업특강을 새로 맡았는데, 아직 신청한 학생이 없어 학생번호를 NULL 값으로 삽입해야 하는 문제 발생
  • 수정이상 : 김교수의 특강 이름 변경시 데이터 불일치 발생 가능성 존재

(학생번호, 특강이름) → 교수

교수 → 특강이름 관계가 성립하는데,

이때 교수는 결정자이지만 후보키는 아니므로 이상현상이 발생한다.

특강수강
학생번호교수
501김교수
401김교수
402승교수
502박교수
501홍교수

특강교수
특강이름교수
소셜네트워크김교수
인간과 동물승교수
창업전략박교수
창업전략홍교수

위와 같이 분리하게 되면 이상현상들이 해결된다.

제 4, 5정규형까지 존재하지만, 대부분은 BCNF까지 정규화하면 실제적인 이상현상은 거의 없어지므로, 보통 BCNF까지 정규화를 진행한다.

예상 질문

정규화가 무엇인가요?

  • 정규화를 하지 않을 경우, 발생할 수 있는 이상현상에 대해 설명해 주세요.
  • 각 정규화에 대해, 그 정규화가 진행되기 전/후의 테이블의 변화에 대해 설명해 주세요.
  • 정규화가 무조건 좋은가요? 그렇지 않다면, 어떤 상황에서 역정규화를 하는게 좋은지 설명해 주세요.

출처

  • MySQL로 배우는 데이터베이스 개론과 실습
profile
hello dev!!

0개의 댓글