SQL
[ SQLD ] 정규화 (Normalization)
hanjuCoding
2024. 8. 4. 19:40
정규화란?
DB 내부의 데이터 구조를 조직화 & 최적화하는 것.
논리 데이터 모델의 일관성 확보
+) 이상현상(anomaly) 제거
- 정규화의 목표 : 테이블 간의 중복된 데이터를 허용하지 않는 것
- 정규화의 장점: 데이터 중복제거, 효율성 향상, 데이터 무결성 보장
- 제 1차, 2차 , 3차 , 4차 , 5차 , BCNF 정규화가 있음.
제 1 정규화
DB의 각 칼럼이 원자값(하나의 값)을 가지게 하는 정규화
속성의 원자성 확보, 다중값 속성 분리
이름 | 취미 |
김김김 | 축구, 영화보기 |
박박박 | 책읽기 |
이이이 | 술먹기, 잠자기 |
김김김,이이이가 각각 취미를 2개 가지고 있으므로 1차 정규화를 해줘야함
이름 | 취미 |
김김김 | 축구 |
김김김 | 영화보기 |
박박박 | 책읽기 |
이이이 | 술먹기 |
이이이 | 잠자기 |
제 2 정규화
1차 정규화를 마친 후, 부분 함수 종속성 제거 (완전 함수 종속을 만들기 위해 테이블을 분리하는것)
기본키의 부분집합이 결정자가 되어선 안된다.
수업코드 | 과목 | 학생 |
001 | 과학 | 김김김 |
001 | 과학 | 나나나 |
002 | 체육 | 박박박 |
002 | 체육 | 이이이 |
003 | 수학 | 최최최 |
수업코드(기본키)의 부분집합인 과목이 결정자가 되므로 테이블을 나눠줘야함
수업코드 | 학생 |
001 | 김김김 |
001 | 나나나 |
002 | 박박박 |
002 | 이이이 |
003 | 최최최 |
수업코드 | 과목 |
001 | 과학 |
002 | 체육 |
003 | 수학 |
제 3 정규화
2차 정규화가 완료된 테이블에서, 이행 함수 종속성 제거하여 서로 종속관계가 있는 일반속성을 분리함
쉽게 설명하면 , A -> B, B -> C 이면, A -> C일 때이다.
그래서 하나의 테이블 안에 A -> B -> C 가 있다면, A->B , B->C 테이블로 나눠줘야함
수업코드 | 과목명 | 교수명 |
001 | Java | 김교수 |
002 | C | 박교수 |
003 | Python | 최교수 |
수업코드 -> 과목명 ->교수명 함수 종속 관계이므로 이를 쪼개줘야함
수업코드 | 과목명 |
001 | Java |
002 | C |
003 | Python |
과목명 | 교수명 |
Java | 김교수 |
C | 박교수 |
Python | 최교수 |
BCNF 정규화
제 3 정규화를 마친 테이블에서 모든 결정자가 후보키가 되도록 하는 정규화
학생코드 | 과목명 | 담당교수 |
101 | Java | 김교수 |
102 | Java | 박교수 |
103 | C | 최교수 |
104 | C | 이교수 |
여기서 기본키는 학생코드,과목명이다.
이때, 담당교수를 보면 과목명을 알 수 있기 때문에, 담당교수 -> 과목명이 종속적이다.
따라서 후보키에 속하지 않은 결정자(담당교수)가 있으므로 정규화를 진행해야한다.
학생코드 | 과목명 |
101 | Java |
102 | Java |
103 | C |
104 | C |
담당교수 | 과목명 |
김교수 | Java |
박교수 | Java |
최교수 | C |
이교수 | C |
정규화 단점
정규화를 진행한 후에 데이터를 조회하기 위해서 조인을 사용해야 하는데, 이로 인해 성능 저하가 발생할 수 있다.
따라서, 반정규화를 고려해야한다.
SQLD 합격을 위해 킵고잉