정규화란?
- 테이블간 중복된 데이터를 허용하지 않는 것
- 정규화를 통하여 무결성을 유지할 수 있으며 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라는종속관계가 있을 때, X→ Z가성립하는경우
정규화 전
학생 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 |