에듀테크 프로젝트 대시보드
데이터베이스 정규화 (Normalization)
하나의 큰 표에 모든 정보를 몰아넣으면 같은 값이 여러 줄에 중복되고, 그 때문에
데이터를 넣거나(삽입 이상) 고치거나(갱신 이상) 지울 때(삭제 이상) 엉뚱한 문제가 생긴다.
정규화는 함수 종속(functional dependency)을 기준으로 표를 잘게 쪼개서 중복을 없애는 설계 절차다.
X → Y 는 "X 값이 정해지면 Y 값도 하나로 정해진다"는 뜻. 아래에서 한 단계씩 분해해 보자.
맨 처음의 한 덩어리 표 수강(학번, 이름, 학과, 학과사무실, 수강과목, 성적) 를 그대로 쓴다고 하면:
아직 아무 과목도 안 들은 신입생을 등록하려면 수강과목·성적을
억지로 NULL로 채워야 한다. 과목 없이는 학생을 못 넣는다.
컴퓨터공학과 사무실이 이사하면 그 학과 학생이 나온 모든 행의
학과사무실을 고쳐야 한다. 한 줄이라도 빠지면 값이 서로 안 맞는다.
이서준이 유일하게 듣던 과목을 취소해 그 행을 지우면, 이서준의 이름·학과 정보까지 통째로 사라진다.
세 이상 현상 모두 "한 표에 서로 다른 주제(학생·학과·수강)가 섞여 있고 값이 중복되기 때문"에 생긴다. 표를 주제별로 나누면 사라진다.
# 원래 표의 후보키: (학번, 수강과목) 학번 → 이름, 학과 # 키의 일부만으로 결정 → 부분 함수 종속 (2NF 위반) 학과 → 학과사무실 # 키가 아닌 속성이 다른 속성을 결정 → 이행적 종속 (3NF 위반) (학번, 수강과목) → 성적 # 키 전체로만 결정 → 정상 (완전 함수 종속)
"자료구조, 알고리즘" 같은 다중 값 금지.키 → A → B 처럼 비(非)키 속성을 거쳐 결정되는 속성을 분리.| 단계 | 제거하는 문제 | 이 예제에서 나뉘는 표 |
|---|---|---|
| 1NF | 다중 값 칸 | 행을 펼쳐 1과목 = 1행 |
| 2NF | 부분 함수 종속 | 학생 / 수강 |
| 3NF | 이행적 종속 | 학생 / 학과 / 수강 |
과유불급: 너무 잘게 쪼개면 조회할 때마다 JOIN이 많아져 느려질 수 있다.
읽기 성능이 중요한 경우 일부러 중복을 허용하는 역정규화(denormalization)를 하기도 한다.