💡 핵심 인사이트
정규화(Normalization)는 삽입, 삭제, 갱신 시 발생하는 무서운 에러(이상 현상, Anomaly)를 뿌리 뽑기 위해, 기형적으로 뚱뚱한 하나의 릴레이션(테이블)을 의미 있는 함수적 종속성에 따라 여러 개의 날씬한 릴레이션으로 쪼개는(무손실 분해) 외과 수술 과정입니다.
테이블에 남아있는 "중복의 낭비"를 없애고 "단일 진실(Single Source of Truth)"을 만드는 가장 위대한 DB 설계 기법입니다.


Ⅰ. 정규화의 목적 (왜 굳이 테이블을 찢는가?)

DB 초보자는 테이블을 여러 개 쪼개놓으면, 나중에 데이터를 합쳐서 볼 때(JOIN) 컴퓨터가 힘들어하고 속도가 느려진다고 싫어합니다. (실제로 조인 과부하가 발생합니다.)

그런데도 왜 에드가 코드 박사를 비롯한 수학자들은 테이블을 갈기갈기 찢으라고 강제했을까요?

  • 데이터 중복 최소화: 똑같은 학생 정보가 수강 데이터 때문에 10줄씩 반복 저장되는 디스크 낭비를 막기 위함입니다.
  • 이상 현상 (Anomaly) 방지: 테이블이 뚱뚱하면 학생이 휴학할 때 수강 내역까지 통째로 날아가는 비극(삭제 이상)이나 정보가 꼬이는(갱신 이상) 일이 벌어집니다.
  • 유연한 구조: 정규화된 테이블은 레고 블록처럼 구조가 탄탄해서, 5년 뒤 새로운 비즈니스 기능(예: 장학금 테이블)을 덧붙일 때 구조를 갈아엎을 필요 없이 쉽게 확장됩니다.

Ⅱ. 정규화의 기본 원리: 무손실 분해와 종속성 보존

막무가내로 테이블을 반으로 자른다고 정규화가 아닙니다. 외과 수술 후에도 생명(데이터)은 유지되어야 합니다.

  1. 무손실 조인 분해 (Lossless-Join Decomposition) ★절대 원칙
    • 뚱뚱한 테이블 $R$을 두 개의 날씬한 테이블 $R1$과 $R2$로 찢었습니다.
    • 나중에 이 $R1$과 $R2$를 공통 속성(외래 키)을 기준으로 다시 조인(Join)하여 합쳤을 때, 분해하기 전의 원본 $R$과 토씨 하나 틀리지 않고 100% 완벽하게 똑같은 데이터가 복원되어야 한다는 제1 원칙입니다. 가짜 정보(Spurious Tuples)가 섞여 나오면 그건 잘못 자른 수술(손실 분해)입니다.
  2. 함수적 종속성 보존 (Dependency Preservation)
    • 테이블을 찢었더라도, 기존에 존재했던 A가 B를 지배한다는 룰(종속성)이 어느 한쪽 테이블에는 반드시 온전히 살아남아 유지되어야 합니다.

Ⅲ. 정규형(Normal Form, NF)의 진화 단계

테이블이 앓고 있는 병(종속성)의 심각성에 따라 수술의 강도가 1단계부터 5단계까지 올라갑니다.

  • 제1 정규형 (1NF): 모든 칸에 콤마(,) 없이 원자값만 넣어라!
  • 제2 정규형 (2NF): 얌체처럼 복합키 일부에만 기생하는 부분 함수 종속을 뜯어내라!
  • 제3 정규형 (3NF): 일반 속성끼리 꼬리 무는 다단계 하청 구조인 이행적 함수 종속을 뜯어내라!
  • BCNF (보이스-코드 정규형): 일반 속성이 역으로 기본 키를 지배하는 반란(모든 결정자가 후보키가 아님)을 진압하라!
  • (대부분의 기업용 실무 DB는 BCNF나 제3정규형까지만 수술해도 99% 완벽하게 돌아갑니다.)

📢 섹션 요약 비유: 비정규화된 테이블은 샴쌍둥이처럼 두 명의 환자(학생 개체, 수강 개체)가 심장을 공유하며 억지로 한 몸으로 붙어있는 상태입니다. 한 명만 수술하려 해도 둘 다 죽을 수 있는 이상 현상(Anomaly)이 터집니다. 정규화는 최고의 외과 의사가 이 둘의 생명(무손실 분해)을 완벽히 살리면서, 각자의 장기와 뼈대(함수적 종속성)를 온전히 유지한 채 두 명의 날씬한 독립된 사람으로 분리해 주는 기적의 분리 수술입니다.