C

데이터베이스 정규화란? 1NF 2NF 3NF 쉽게 정리

2026-05-14 · Database · 정규화 · 설계 · 입문

데이터베이스 정규화란 무엇인가

데이터베이스 정규화란 테이블을 잘 설계해 데이터 중복을 줄이고, 삽입·수정·삭제 시 발생하는 이상 현상(anomaly)을 막는 과정입니다. 한 테이블에 모든 정보를 욱여넣으면 같은 값이 여러 행에 반복되고, 한 군데만 고치면 다른 곳과 어긋나 데이터가 깨집니다. 정규화는 이런 문제를 단계(정규형)별로 풀어 나가는 설계 기법입니다.

이 글에서는 입문자가 가장 많이 접하는 1NF, 2NF, 3NF를 예제로 쉽게 정리합니다. 잘못 설계된 "수강 신청" 테이블 하나를 단계별로 고쳐 나가 봅시다.

-- 정규화 전 (문제 많은 테이블)
학번  | 이름  | 학과   | 학과사무실 | 과목코드들
1001 | 김철수 | 컴공   | A-301     | C01, C02
1002 | 이영희 | 전자   | B-205     | C01

제1정규형(1NF): 값을 쪼개라

1NF는 모든 컬럼이 더 이상 나눌 수 없는 원자값(atomic value)을 가져야 한다는 규칙입니다. 위 테이블의 과목코드들처럼 한 칸에 여러 값(C01, C02)이 들어 있으면 위반입니다. 한 행이 하나의 과목만 갖도록 분리합니다.

-- 1NF 적용
학번  | 이름  | 학과 | 학과사무실 | 과목코드
1001 | 김철수 | 컴공 | A-301     | C01
1001 | 김철수 | 컴공 | A-301     | C02
1002 | 이영희 | 전자 | B-205     | C01

이제 한 칸에 값이 하나씩만 들어 있습니다. 대신 김철수의 이름·학과 정보가 중복되기 시작합니다. 이 중복은 다음 단계에서 해결합니다.

제2정규형(2NF): 부분 종속을 제거하라

2NF는 1NF를 만족하면서, 기본키의 일부에만 종속되는 컬럼(부분 종속)이 없어야 한다는 규칙입니다. 위 테이블의 기본키가 (학번, 과목코드) 복합키라고 합시다. 그런데 이름학과는 과목코드와 무관하게 학번만으로 결정됩니다. 즉 키의 일부(학번)에만 종속됩니다. 이것이 부분 종속입니다.

학번에만 종속되는 컬럼을 별도 테이블로 분리합니다.

-- 학생 테이블 (PK: 학번)
학번  | 이름  | 학과 | 학과사무실
1001 | 김철수 | 컴공 | A-301
1002 | 이영희 | 전자 | B-205

-- 수강 테이블 (PK: 학번 + 과목코드)
학번  | 과목코드
1001 | C01
1001 | C02
1002 | C01

이제 김철수의 이름은 한 곳에만 저장됩니다.

제3정규형(3NF): 이행 종속을 제거하라

3NF는 2NF를 만족하면서, 기본키가 아닌 컬럼이 다른 일반 컬럼에 종속되지 않아야 한다는 규칙입니다. 이를 이행 종속(transitive dependency)이라 합니다. 학생 테이블에서 학과사무실학번이 아니라 학과에 의해 결정됩니다(학번 → 학과 → 학과사무실). 이 연쇄 종속을 끊어야 합니다.

-- 학생 테이블 (PK: 학번)
학번  | 이름  | 학과
1001 | 김철수 | 컴공
1002 | 이영희 | 전자

-- 학과 테이블 (PK: 학과)
학과 | 학과사무실
컴공 | A-301
전자 | B-205

이제 컴공 사무실이 바뀌어도 학과 테이블 한 줄만 고치면 됩니다.

정규형 비교표

정규형핵심 규칙제거 대상
1NF모든 값은 원자값반복 그룹, 다중 값
2NF키 전체에 종속부분 종속
3NF키에만 직접 종속이행 종속

실전 팁

정규화는 보통 3NF까지만 해도 실무에 충분합니다. 그 위로 BCNF, 4NF가 있지만 입문 단계에서는 3NF 이해가 우선입니다. 한편 조회 성능이 중요한 통계·집계 화면에서는 일부러 중복을 허용하는 "비정규화(denormalization)"를 적용하기도 합니다. 즉 정규화는 절대 규칙이 아니라, 데이터 무결성과 성능 사이의 균형을 잡는 출발점입니다.

흔한 실수

1. 콤마로 값 여러 개를 한 칸에 저장하기. tags = "java,sql,spring" 같은 설계는 1NF 위반이며, 검색·조인이 매우 불편해집니다. 별도 테이블로 분리하세요.

2. 무조건 잘게 쪼개기. 정규화 자체가 목적이 되어 테이블을 과하게 나누면 조인이 늘어 쿼리가 복잡하고 느려집니다. 도메인 요구에 맞춰 적정 수준에서 멈추는 판단이 필요합니다.

자주 묻는 질문

Q1. 정규화를 꼭 해야 하나요?

데이터 정합성이 중요한 시스템(주문, 결제, 회원 등)에서는 거의 필수입니다. 다만 읽기 위주의 분석용 데이터는 비정규화를 함께 고려합니다.

Q2. 함수 종속이 정확히 무슨 뜻인가요?

A 값이 정해지면 B 값이 항상 하나로 결정될 때 "B는 A에 함수 종속된다"고 합니다. 예를 들어 학번이 정해지면 이름이 하나로 정해지므로 이름은 학번에 종속됩니다.

Q3. 1NF, 2NF, 3NF는 순서대로 해야 하나요?

네. 상위 정규형은 하위 정규형을 만족한다는 전제 위에 정의됩니다. 2NF는 1NF를, 3NF는 2NF를 이미 만족한 상태에서 적용합니다.

데이터베이스 정규화란? 1NF 2NF 3NF 쉽게 정리 | CodeMaster 블로그 | CodeMaster