한양과학기술고등학교

에듀테크 프로젝트 대시보드

데이터베이스 정규화 (Normalization)

데이터베이스 정규화 (Normalization)

하나의 큰 표에 모든 정보를 몰아넣으면 같은 값이 여러 줄에 중복되고, 그 때문에 데이터를 넣거나(삽입 이상) 고치거나(갱신 이상) 지울 때(삭제 이상) 엉뚱한 문제가 생긴다. 정규화는 함수 종속(functional dependency)을 기준으로 표를 잘게 쪼개서 중복을 없애는 설계 절차다. X → Y 는 "X 값이 정해지면 Y 값도 하나로 정해진다"는 뜻. 아래에서 한 단계씩 분해해 보자.

정규화 단계 시뮬레이터

비정규 표에서 생기는 3가지 이상 현상

맨 처음의 한 덩어리 표 수강(학번, 이름, 학과, 학과사무실, 수강과목, 성적) 를 그대로 쓴다고 하면:

삽입 이상 (Insertion)

아직 아무 과목도 안 들은 신입생을 등록하려면 수강과목·성적을 억지로 NULL로 채워야 한다. 과목 없이는 학생을 못 넣는다.

갱신 이상 (Update)

컴퓨터공학과 사무실이 이사하면 그 학과 학생이 나온 모든 행의 학과사무실을 고쳐야 한다. 한 줄이라도 빠지면 값이 서로 안 맞는다.

삭제 이상 (Deletion)

이서준이 유일하게 듣던 과목을 취소해 그 행을 지우면, 이서준의 이름·학과 정보까지 통째로 사라진다.

세 이상 현상 모두 "한 표에 서로 다른 주제(학생·학과·수강)가 섞여 있고 값이 중복되기 때문"에 생긴다. 표를 주제별로 나누면 사라진다.

이 예제의 함수 종속 (FD)

# 원래 표의 후보키: (학번, 수강과목)
학번          → 이름, 학과       # 키의 일부만으로 결정 → 부분 함수 종속 (2NF 위반)
학과          → 학과사무실       # 키가 아닌 속성이 다른 속성을 결정 → 이행적 종속 (3NF 위반)
(학번, 수강과목) → 성적           # 키 전체로만 결정 → 정상 (완전 함수 종속)
  • 1NF: 모든 칸은 더 못 쪼개는 단일 값이어야 한다. "자료구조, 알고리즘" 같은 다중 값 금지.
  • 2NF: 1NF + 부분 함수 종속 제거. 복합키의 일부에만 의존하는 속성을 별도 표로.
  • 3NF: 2NF + 이행적 종속 제거. 키 → A → B 처럼 비(非)키 속성을 거쳐 결정되는 속성을 분리.
  • BCNF: 3NF보다 엄격 — 모든 결정자(→의 왼쪽)가 후보키여야 한다. 대부분 3NF면 실무상 충분.
단계제거하는 문제이 예제에서 나뉘는 표
1NF다중 값 칸행을 펼쳐 1과목 = 1행
2NF부분 함수 종속학생 / 수강
3NF이행적 종속학생 / 학과 / 수강

과유불급: 너무 잘게 쪼개면 조회할 때마다 JOIN이 많아져 느려질 수 있다. 읽기 성능이 중요한 경우 일부러 중복을 허용하는 역정규화(denormalization)를 하기도 한다.