정규화 쉽게 이해하기: 1차·2차·3차 정규화 정리
데이터베이스를 공부하다 보면 정규화라는 말을 반드시 만나게 됩니다. 그런데 처음에는 “왜 굳이 테이블을 나누는지”, “1차·2차·3차 정규화가 어떻게 다른지”가 잘 감이 오지 않습니다. 결론부터 말하면 정규화는 데이터 중복을 줄이고, 수정·삭제·삽입 시 생길 수 있는 문제를 줄이기 위해 테이블 구조를 더 안정적으로 만드는 과정입니다. 이 글에서는 SQL 초보자와 SQLD 준비생이 헷갈리지 않도록 정규화의 이유, 이상 현상, 1차·2차·3차 정규화 차이까지 한 번에 정리해보겠습니다.
- 정규화가 왜 필요한지부터 헷갈리는 분
- 1차, 2차, 3차 정규화 차이를 정리하고 싶은 분
- SQLD를 준비하면서 데이터 모델링 파트가 막히는 분
- 중복 데이터와 이상 현상을 쉽게 이해하고 싶은 비전공자
정규화란 무엇인가
정규화는 데이터 중복을 줄이고, 테이블 구조를 더 논리적으로 나누는 과정입니다.
데이터베이스를 처음 설계할 때는 이것저것 한 테이블에 다 넣고 싶어질 수 있습니다. 하지만 그렇게 하면 같은 데이터가 여러 번 반복되고, 나중에 수정하거나 삭제할 때 예상치 못한 문제가 생기기 쉽습니다.
쉽게 말하면 정규화는 한 테이블에 뒤엉킨 정보를 역할별로 정리해서 관리하기 쉽게 만드는 작업입니다.
정규화가 왜 필요할까
정규화가 필요한 가장 큰 이유는 중복 데이터와 이상 현상 때문입니다.
예를 들어 아래처럼 수강 정보를 한 테이블에 몰아서 저장한다고 가정해보겠습니다.
학생ID | 학생명 | 과목명 | 교수명 | 교수연락처
1 | 김철수 | 데이터베이스 | 박교수 | 010-1111-1111
1 | 김철수 | 운영체제 | 이교수 | 010-2222-2222
2 | 이영희 | 데이터베이스 | 박교수 | 010-1111-1111
여기서는 학생 정보, 과목 정보, 교수 정보가 한 테이블에 섞여 있습니다. 이 구조는 처음엔 편해 보여도 나중에 여러 문제가 생깁니다.
이상 현상이란 무엇인가
이상 현상은 잘못 설계된 테이블에서 데이터 입력, 수정, 삭제 시 비정상적인 문제가 생기는 현상입니다.
1. 삽입 이상
아직 학생이 수강 신청을 하지 않았는데, 교수 정보만 먼저 넣고 싶다고 해보겠습니다. 그런데 모든 정보가 한 테이블에 묶여 있으면 학생 정보 없이 교수 정보만 넣기 어려울 수 있습니다.
2. 수정 이상
박교수 연락처가 바뀌면 데이터베이스 과목을 듣는 모든 행을 찾아서 수정해야 합니다. 하나라도 놓치면 같은 교수 연락처가 서로 다르게 저장되는 문제가 생깁니다.
3. 삭제 이상
어떤 학생이 마지막으로 듣고 있던 데이터베이스 과목 수강 정보를 삭제했더니, 교수 정보까지 함께 사라지는 상황이 생길 수 있습니다.
즉, 정규화는 단순히 “예쁘게 나누는 것”이 아니라 이상 현상을 줄이기 위한 설계 원칙입니다.
1차 정규화란
1차 정규화는 하나의 칸에 하나의 값만 들어가도록 만드는 것입니다. 즉, 반복되는 속성이나 여러 값이 한 칸에 들어가는 구조를 없애는 단계입니다.
예를 들어 아래처럼 한 학생이 여러 과목을 한 칸에 저장하는 구조가 있다고 해보겠습니다.
학생ID | 학생명 | 수강과목
1 | 김철수 | 데이터베이스, 운영체제
이런 구조는 한 칸에 여러 값이 들어가 있으므로 1차 정규화가 되어 있지 않다고 볼 수 있습니다.
이를 1차 정규화하면 보통 아래처럼 나눕니다.
학생ID | 학생명 | 수강과목
1 | 김철수 | 데이터베이스
1 | 김철수 | 운영체제
1차 정규화 핵심
- 하나의 칸에는 하나의 값만
- 반복 속성 제거
- 원자값 유지
2차 정규화란
2차 정규화는 부분 함수 종속을 제거하는 단계입니다. 초보자 입장에서는 이 표현이 어렵게 느껴질 수 있는데, 쉽게 말하면 복합키의 일부에만 종속되는 컬럼을 따로 분리하는 것이라고 이해하면 됩니다.
예를 들어 아래처럼 수강 테이블이 있다고 해보겠습니다.
학생ID | 과목ID | 학생명 | 과목명
1 | DB101 | 김철수 | 데이터베이스
1 | OS201 | 김철수 | 운영체제
2 | DB101 | 이영희 | 데이터베이스
여기서 기본키가 (학생ID, 과목ID) 같은 복합키라고 가정하면:
학생명은 학생ID에만 종속됩니다과목명은 과목ID에만 종속됩니다
즉, 학생명과 과목명은 복합키 전체에 의존하지 않고 일부에만 의존하고 있습니다. 이런 경우 학생 정보와 과목 정보를 따로 분리하는 것이 2차 정규화입니다.
학생 테이블
학생ID | 학생명
과목 테이블
과목ID | 과목명
수강 테이블
학생ID | 과목ID
2차 정규화 핵심
- 복합키가 있을 때 주로 문제를 본다
- 키 일부에만 종속되는 컬럼을 분리한다
- 학생 정보, 과목 정보 같은 독립 정보를 나눈다
3차 정규화란
3차 정규화는 이행 함수 종속을 제거하는 단계입니다. 이것도 처음 들으면 어렵지만, 쉽게 말하면 기본키가 아닌 일반 컬럼끼리의 종속 관계를 끊는 것이라고 이해하면 됩니다.
예를 들어 아래처럼 학생 테이블이 있다고 해보겠습니다.
학생ID | 학과명 | 학과사무실
1 | 컴퓨터공학과 | 공학관 301호
2 | 컴퓨터공학과 | 공학관 301호
3 | 경영학과 | 본관 205호
여기서는 학생ID가 기본키라고 볼 수 있습니다.
그런데 학과사무실은 학생ID가 아니라 학과명에 의해 결정됩니다.
즉,
- 학생ID → 학과명
- 학과명 → 학과사무실
이런 관계가 있으면 학생ID를 통해 간접적으로 학과사무실이 결정됩니다. 이를 이행 함수 종속이라고 보고, 학과 정보를 따로 분리하는 것이 3차 정규화입니다.
학생 테이블
학생ID | 학과명
학과 테이블
학과명 | 학과사무실
3차 정규화 핵심
- 기본키가 아닌 컬럼 사이 종속 관계를 본다
- 일반 컬럼이 다른 일반 컬럼을 결정하면 분리한다
- 중복과 수정 이상을 더 줄이는 단계다
1차·2차·3차 정규화를 표로 비교하면
| 구분 | 핵심 목표 | 쉽게 말하면 |
|---|---|---|
| 1차 정규화 | 원자값 유지 | 한 칸에 하나의 값만 넣기 |
| 2차 정규화 | 부분 함수 종속 제거 | 복합키 일부에만 의존하는 컬럼 분리 |
| 3차 정규화 | 이행 함수 종속 제거 | 일반 컬럼끼리 의존하는 관계 분리 |
정규화를 하면 무조건 좋은가
입문 단계에서는 정규화가 매우 중요하지만, 실무에서는 무조건 많이 나누는 것이 항상 정답은 아닙니다.
너무 잘게 나누면 JOIN이 많아지고 조회가 복잡해질 수 있기 때문입니다. 그래서 실무에서는 정규화로 기본 구조를 안정적으로 만든 뒤, 필요에 따라 반정규화를 검토하기도 합니다.
다만 SQLD 입문 단계에서는 먼저 정규화가 왜 필요한지와 1차·2차·3차 차이를 정확히 이해하는 것이 우선입니다.
초보자가 정규화에서 자주 하는 실수
정규화를 그냥 테이블 쪼개기로만 이해하는 것
정규화는 단순 분리가 아니라 중복과 이상 현상을 줄이기 위한 기준 있는 분리입니다.
1차, 2차, 3차를 모두 암기만 하려는 것
용어만 외우면 금방 헷갈립니다. “무슨 문제를 없애기 위해 나누는가”를 같이 이해해야 오래 갑니다.
2차 정규화와 3차 정규화를 같은 느낌으로 보는 것
2차 정규화는 복합키 일부 종속, 3차 정규화는 일반 컬럼 간 종속을 보는 것이라고 구분하면 훨씬 쉽습니다.
비전공자는 이렇게 외우면 쉽다
- 1차 정규화 = 한 칸에 하나만
- 2차 정규화 = 복합키 일부에만 걸리는 정보 분리
- 3차 정규화 = 일반 컬럼끼리 연결된 정보 분리
- 정규화의 목적은 결국 중복 줄이기 + 이상 현상 줄이기입니다.
핵심 요약
- 정규화는 데이터 중복을 줄이고 이상 현상을 방지하기 위한 설계 과정입니다.
- 1차 정규화는 한 칸에 하나의 값만 들어가게 만드는 것입니다.
- 2차 정규화는 복합키 일부에만 의존하는 컬럼을 분리하는 것입니다.
- 3차 정규화는 일반 컬럼끼리의 종속 관계를 분리하는 것입니다.
- 비전공자는 “왜 나누는가”를 먼저 이해하면 정규화가 훨씬 쉬워집니다.
FAQ
정규화는 왜 필요한가요?
중복 데이터를 줄이고, 삽입 이상·수정 이상·삭제 이상 같은 문제를 줄이기 위해 필요합니다.
1차 정규화는 가장 쉽게 어떻게 이해하면 되나요?
한 칸에 하나의 값만 들어가게 만드는 것이라고 이해하면 가장 쉽습니다.
2차 정규화와 3차 정규화가 헷갈리는데 어떻게 구분하나요?
2차 정규화는 복합키 일부에만 의존하는 컬럼을 분리하는 것이고, 3차 정규화는 일반 컬럼끼리 의존하는 관계를 분리하는 것입니다.
정규화는 무조건 많이 할수록 좋은가요?
기본적으로는 중요하지만, 실무에서는 조회 성능과 복잡도도 함께 고려해야 합니다. 입문 단계에서는 우선 정규화 원리를 이해하는 것이 더 중요합니다.
SQLD에서도 정규화가 자주 나오나요?
자주 나옵니다. 특히 데이터 모델링, 식별자, 관계와 함께 연결해서 이해하는 것이 중요합니다.
'자격증 준비 > SQLD' 카테고리의 다른 글
| 엔터티와 속성 차이 쉽게 이해하기: 데이터 모델링 초보자용 정리 (0) | 2026.03.12 |
|---|---|
| 식별자 종류 정리: 기본키, 후보키, 슈퍼키 차이 쉽게 이해하기 (3) | 2026.03.12 |
| JOIN 종류와 차이 초보자용 정리: INNER JOIN, LEFT JOIN 쉽게 이해하기 (0) | 2026.03.11 |
| PK와 FK 차이 쉽게 이해하기: SQL 초보자가 가장 먼저 알아야 할 개념 (0) | 2026.03.11 |
| SQL 실행 순서 한 번에 이해하기: SELECT문을 읽는 기본 구조 (0) | 2026.03.10 |