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 합격을 위해 킵고잉