SQL 정규화(Normalization)는 데이터베이스 테이블을 설계할 때 데이터의 중복을 최소화하고, 데이터의 일관성과 무결성을 보장하기 위해 테이블을 체계적으로 분리하는 과정임.
쉽게 말해, 하나의 거대한 테이블에 모든 정보를 다 담는 게 아니라, 관련 있는 데이터끼리 묶어서 여러 개의 작은 테이블로 나누는 '데이터 정리정돈' 규칙이라 보면 됨.
만약 정규화를 무시하고 하나의 큰 테이블에 모든 데이터를 저장하면, '데이터 이상(Anomaly)' 현상이 발생함. 이는 데이터를 관리(삽입, 수정, 삭제)할 때 의도치 않은 심각한 문제가 생기는 것을 의미함.
삽입 이상 (Insertion Anomaly)
갱신 이상 (Update Anomaly)
삭제 이상 (Deletion Anomaly)
정규화는 바로 이 '이상 현상'을 방지하여 데이터의 신뢰도를 높이는 것이 핵심 목표임.
정규화는 단계별로 규칙을 적용하며, 각 단계를 '정규형'이라고 부름. 실무에서는 보통 제3정규형(3NF)까지 만족시키는 것을 목표로 함.
"모든 컬럼(속성)의 값은 '원자값(Atomic Value)'이어야 한다."
"1NF를 만족하고, '부분 함수 종속'을 제거해야 한다."
(학생ID, 과목ID)가 복합 기본 키인 테이블에 학생이름 컬럼이 있다고 가정해 보자. 학생이름은 학생ID에만 의존함 (과목ID와는 상관없음). 이것이 '부분 함수 종속'임.(학생ID, 학생이름)을 '학생 테이블'로 따로 분리해야 함."2NF를 만족하고, '이행 함수 종속'을 제거해야 한다."
(학생ID, 학과명, 학과사무실_전화번호)가 있다고 가정해 보자. 학과사무실_전화번호는 학과명에 의해 결정됨. (학생ID → 학과명 → 학과사무실_전화번호). 이것이 '이행 함수 종속'임.(학과명, 학과사무실_전화번호)를 '학과 테이블'로 따로 분리해야 함.| 장점 👍 | 단점 👎 |
|---|---|
| 데이터 중복 최소화 (저장 공간 효율) | 테이블이 많이 분리되어 구조가 복잡해짐 |
| 데이터 무결성 및 일관성 보장 | 데이터를 조회(SELECT)할 때 JOIN 연산이 많아짐 |
| '데이터 이상 현상' 원천 방지 | JOIN이 많아지면 조회 성능이 저하될 수 있음 |
| 데이터 구조가 명확해져 유지보수 용이 |
정규화는 데이터의 일관성을 지키기 위한 매우 중요한 설계 원칙임. 하지만 과도한 정규화는 오히려 성능을 저하시킬 수 있음.
따라서 실제 시스템 설계 시에는 데이터의 성격과 성능 요구사항을 고려하여, 의도적으로 정규화 수준을 낮추는 '반정규화(Denormalization)'를 통해 성능과 데이터 일관성 사이의 균형을 맞추는 전략이 필요함.
정규화는 아주 헷갈리는 개념이다. 그래서 까먹지 말고 반복적으로 외워야겠다.