데이터 베이스

데이터 베이스 정규화

쭈녁 2023. 12. 12. 22:54

정규화란?

  • 테이블간 중복된 데이터를 허용하지 않는 것
  • 정규화를 통하여 무결성을 유지할 수 있으며 DB 저장 공간을 줄일 수 있다.

 

제1 정규화

테이블의 컬럼이 원자값(Atomic Value, 하나의 값) 갖도록 테이블을 분해한다.

 

정규화 전

이름 강의
Kim 국어
Lee 과학,수학
Park 영어
Jang 한자,중국어

 

 

정규화 후

이름 강의
Kim 국어
Lee 과학
Lee 수학
Park 영어
Jang 한자
Jang 중국어

 

제 2정규화

  • 1차 정규화를 진행한 테이블에 대해 기본키의 일부(결과값을 결정하는 일부분)로 데이터가 결정되지 않도록 정규화 하는 것
  • *부분함수종속제거하고 *완전함수종속되도록 테이블을 분해하는 과정
    • *부분함수종속 : 기본키를 구성하는 속성 일부가 다른 컬럼의 결정자 역할을 하는 경우
    • *완전함수종속: 기본키를 구성하는 속성 모두가 결정자 역할을 하는 경우 (부분함수종속의 반대)

 

정규화 전

학생 ID 학생 이름 강의명 교수명 성적
1 aaa 국어 Kim 3.5
2 bbb 국어 Kim 4.0
3 ccc 영어 Park 3.0
4 ddd 수학 Jang 4.0
5 eee 과학 Lee 3.5

 

 

삽입 이상 : 학생이 특정 과목의 성적을 입력할 때 반드시 강의명과 교수명을 알아야 한다. (불필요)

제 이상 : 3번 학생이 영어 과목을 취소하면, 영어 과목에 대한 정보가 사라진다(강의명, 교수명). 

- 갱신 이상 : 국어 과목의 교수를 변경할 때, 강의명이 국어 인 모든 행을 찾아변경해 한다. 

 

정규화 후

 

학생 ID 학생 이름
1 aaa
2 bbb
3 ccc
4 ddd
5 eee

 

학생 ID 강의명 교수명 성적
1 국어 Kim 3.5
2 국어 Kim 4.0
3 영어 Park 3.0
4 수학 Jang 4.0
5 과학 Lee 3.5

제 3 정규화

  • 제 2 정규화를 진행한 테이블에 대해 *이행적 종속을 없도록 분해
    • *이행적 종속 : X → Y, Y → Z라는종속관계가 있을 , XZ성립하는경우

정규화 전

학생 ID 강의명 수강료

학생 ID 강의명 교수명 성적
1 국어 Kim 3.5
2 국어 Kim 4.0
3 영어 Park 3.0
4 수학 Jang 4.0
5 과학 Lee 3.5

 

- 삽입 이상 : 강의를 추가할 때 반드시 학생 ID가 있어야 한다. (불필요한 정보 필요)

- 삭제 이상 : 3번 학생이 삭제되는 경우 영어 강의의 정보가 사라진다. 

- 갱신 이상 : 과목이 변경되는 경우 모두 찾아서 변경해야한다. (같은 강의를 듣는 학생이 여러 명 있는 경우)

 

정규화 후

학생ID 강의명  성적
1 국어 3.5
2 국어 4.0
3 영어 3.0
4 수학 4.0
5 과학 3.5

 

강의명 교수명
국어 Kim
국어 Kim
영어 Park
수학 Jang
과학 Lee

 

다치 종속

상황 : 하나의 과목을 여러 교수가 가르치며 여러 교재가 사용됨

과목의 교수를 새로 등록하기 위해 교재별 튜플을 만들어야하므로 교수가 중복 등록 됨

과목 교수 교재
Python P1 B1
Python P1 B2
Python P2 B1
Python P2 B2
Java P3 B3
Java P4 B4

 

조인종속

과목 교수 학생
Python P1 S1
Python P2 S2
Python P1 S2
C P3 S1

 

테이블을 분해했다가 다시 조인했을때 컬럼 수가 늘어나는 현상이 발생한다.

 

테이블 분해

과목 교수
Python P1
Python P2
C P3
과목 학생
Python S1
Python S2
C S1

 

조인

과목 교수 학생
Python P1 S1
Python P1 S2
Python P2 S2
Python P2 S2
C P3 S1

 

결정자를 PK , FK로 사용하여 발생한 문제이다. 이런 경우 과목+교수 를 PK와 FK로 사용하여 조인하여야 조인 종속이 일어나지 않는다.

 

 

'데이터 베이스' 카테고리의 다른 글

윈도우함수 와 집계함수  (1) 2024.01.27
서브쿼리 와 View  (1) 2024.01.26
계층형 질의  (0) 2024.01.26
트랜잭션과 격리 수준  (0) 2023.12.29
MySQL 명령어 및 쿼리 (익숙하지 않은 문법 기록용)  (0) 2023.12.12