티스토리 뷰
https://mangkyu.tistory.com/110
[Database] 정규화(Normalization) 쉽게 이해하기
지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz
mangkyu.tistory.com
정규화란?
테이블간 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나 이를 해결하기 위해 테이블을 분리하는것.
데이터베이스 이상현상이란 회원이 한 개의 등급을 갖어야 하는데 여러개를 갖거나 삭제할때 필요한 데이터가 같이 삭제되는 등.
정규화의 기본 목표는 테이블간 중복된 데이터를 허용하지 않는것.
중복된 데이터를 허용하지 않음으로서 무결성(데이터는 어떤 경로를 통해 들어왔던지 오류가 있어서는 안되는 성질)을 유지, db 용량 줄임.
제 1 정규화
테이블의 컬럼이 원자값을 갖도록 테이블을 분해하는것.
추신수와 박세리는 여러개의 취미를 갖고 있어서 테이블의 컬럼이 원자값을 갖고 있지 않다.
제1 정규화 이후는 이렇게 분리 된다.
제 2 정규화
제1정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는것.
완전 함수 종속이란 기본키의 부분집합이 결정자가 되어서는 안된다는 것을 의미.
이 테이블의 기본키는 (학생번호, 강좌이름) 으로 복합키이다.
그런데 이 테이블의 강의실 컬럼은 기본키의 부분집합인 강좌이름으로 결정될수 있다. (강좌이름) -> (강의실)
= 그런데 강의실 컬럼은 기본키인 (학생번호, 강좌이름)에 종속되지 않고 강좌이름 에만 종속되는 부분적 종속이다.
즉 기본키 (학생번호, 강좌이름)의 부분키인 강좌이름이 결정자 이기 때문에 완전 함수 종속에 어긋난다.
따라서 기존의 테이블에서 강좌이름을 분리하여 제2정규형을 만족하도록 할 수 있다.
제 3 정규화
제2정규화를 만족하는 테이블에 대해 이행적 종속을 없애도록 테이블을 분해 하는 것.
이행정 종속이란 A->B, B-C 일때 A->C 가 성립되는 것을 의미한다.
학생번호는 강좌이름을 결정한다.
강좌이름은 수강료를 결정한다.
따라서 학생번호를 알면 수강료를 알수 있기 때문에 이행적 종속이고 이를 없애야 제3정규형을 만족한다.
즉 학생번호->강좌이름, 강좌이름->수강료 로 테이블을 분해한다.
제3정규형을 진행하는 이유는 (이행적 종속을 제거하는 이유는) 예를들어 501번 학생이 수강하는 강좌가 스포츠경영학으로 변경됐다고 치자, 이행적 종속이 존재한다면 501번 학생은 스포츠경영학을 20000 원에 듣게 된다.
물론 강좌이름에 맞게 수강료를 변경할수 있지만 이런 추가 행동을 방지하기 위해 제3정규형을 진행하는 것.
보이스/코드 (BCNF) 정규형
제3정규화를 진행한 테이블에 대해 모든 '결정자' 가 '후보키'가 되도록 테이블을 분해 하는 것.
(학생번호, 과목)이 기본키로 지도교수를 알 수 있다.
하지만 같은 과목을 다른 교수가 가르칠수도 있어서 과목->지도교수 종속은 성립하지 않는다.
하지만 지도교수가 어떤 과목을 가르치는지는 알 수 있으므로 지도교수->과목 종속은 성립한다.
즉 지도교수는 '결정자' 인데 '후보키'가 아니기 때문에, 테이블을 아래와 같이 분해해야 한다.
- Total
- Today
- Yesterday
- priority queue
- Python
- Spring
- recursion
- CSS
- two pointer
- db
- Brute Force
- Stack
- graph
- BFS
- 재귀
- back tracking
- DP
- permutation
- Implementation
- 조합
- Kruskal
- 이분탐색
- Tree
- 자료구조
- binary search
- Dijkstra
- C
- greedy
- dfs
- floyd warshall
- C++
- Unity
- MVC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |