정규화: 중복 데이터를 안 두는 기술
정규화는 한마디로 "같은 정보를 여러 곳에 중복해서 저장하지 않도록 테이블을 쪼개는 작업"입니다. 중복이 있으면 하나만 수정했을 때 나머지가 낡은 값으로 남는 문제(이상현상)가 생기는데, 정규화는 이걸 예방합니다. 단계가 올라갈수록 규칙이 하나씩 더 붙습니다.
1정규형 (1NF): 한 칸엔 값 하나만
모든 속성 값이 원자값이어야 합니다. 한 학생의 "취미" 칸에 "축구, 독서"가 같이 들어있다면, 이걸 행 단위로 쪼개야 합니다.
2정규형 (2NF): 부분 함수 종속 제거
1NF를 만족하고, 기본키 일부에만 종속되는 속성을 별도 테이블로 뺍니다. [학번, 과목코드]가 기본키인 테이블에서 [학번]에만 종속되는 [학생이름]을 별도의 "학생" 테이블로 분리하는 식입니다. (기본키가 원래 속성 1개뿐이면 이 문제는 자동으로 해결됩니다.)
3정규형 (3NF): 이행적 함수 종속 제거
2NF를 만족하고, 기본키가 아닌 속성끼리 원인-결과로 얽혀 있는 것도 분리합니다. 학번 → 학과 → 학과사무실 관계라면, [학과, 학과사무실]을 별도 테이블로 뺍니다.
BCNF: 결정자는 전부 후보키여야 함
3NF까지 만족해도 예외적으로 남는 문제가 있습니다. [학번, 과목명]이 복합 기본키인 테이블에서, 각 과목을 가르치는 [교수]가 한 명뿐이고 그 교수가 오직 그 과목만 가르친다고 하면 교수 → 과목명이 성립합니다. 그런데 [교수]는 후보키가 아닙니다(학번을 구분 못 함). 이렇게 결정자인데 후보키가 아닌 경우가 있으면 BCNF 위반이고, 해결책은 [학번, 교수]와 [교수, 과목명] 두 테이블로 다시 쪼개는 것입니다.
정규화 정도 ─────────────────▶
1NF → 2NF → 3NF → BCNF
(원자값) (부분종속×) (이행종속×) (결정자=후보키)정규화를 많이 할수록 중복은 줄지만, 조회할 때 조인해야 할 테이블 수가 늘어나는 트레이드오프가 있습니다.
참고: 개인 Notion 학습 노트