데이터베이스 관리(DBMS,SQL)

데이터베이스 정규화란? (1NF, 2NF, 3NF, 4NF, 반정규화)

sdesign416 2026. 6. 7. 18:15

데이터베이스를 설계할 때 모든 정보를 하나의 테이블에 저장할수도 있지만,

데이터가 늘어날수록 중복 데이터가 많아지고 관리가 어려워질 수 있다.

 

정규화 작업을 통해 데이터 추가, 수정, 삭제 과정에서 발생하는 이상현상을 해결하고

데이터를 효율적으로 분리하고 관계를 설정할 수 있다.


정규화

정규화(Normalization)란 데이터베이스의 중복 데이터를 최소화하고,

데이터의 일관성을 유지하기 위해 테이블을 구조화 하는 과정이다.

 

하나의 테이블 안에 너무 많은 정보를 저장하면같은 데이터가 여러번 반복되거나 데이터 관리가 어려워질 수 있는데

 

이 문제를 해결하기 위해데이터를 여러 테이블로 분히리하고 관계를 설정하는 작업을 정규화라 한다.


💡 정규화를 왜 진행해야할까?

데이터베이스는 단순히 데이터를 저장하는 공간만이 아닌

정확하고 일관성있는 데이터를 유지할 수 있어야 한다.

 

만약 동일한 정보가 여러곳에 저장된다면

수정을 할 때 일부 데이터만 변경이 되는 문제가 발생할 수 있다.

 

즉, 정규화의 핵심 목적은 중복 제거와 데이터 일관성 유지이다.

 

정규화의 장점

  • 데이터 중복 최소화
  • 저장 공간 절약
  • 데이터 무결성 향상
  • 추가, 수정, 삭제 시 오류 감소
  • 데이터 관리 편의성 증가

❓ 만약 정규화를 진행하지 않으면 어떻게될까?

정규화되지 않은 데이터베이스에선 하나의 정보가 여러 행에 반복되어 저장이 된다.

그러면 데이터를 추가, 수정, 삭제할 때 예상치 못한 문제가 발생할 수 있다.

 

1) 삽입 이상 (Insert Anomaly)

원하는 데이터를 저장하기 위해 불필요한 데이터까지 입력해야 하는 문제이다.

만약 새로운 교수 이교수를 추가해야하는데 담당 과목이 없는 경우가 발생할 수 있는데

위 테이블 구조에선 과목정보도 함께 등록되어야 한다.

즉, 교수를 등록하기 위해선 존재하지 않는 과목정보까지 입력해야 하는 삽입 이상이 발생한다.

 

2) 갱신 이상 발생 (Update Anomaly)

같은 데이터가 여러 행에 저장되어 있어 수정할 때 일부만 변경되는 문제이다.

교수 연락처가 변경될 경우 모든 행을 수정해줘야 한다.

만약 어떤 하나의 행만 수정하지 못했다면

데이터베이스 내부에 서로 다른 연락처가 존재하게 되어 데이터 일관성이 깨지게 된다.

 

3) 삭제 이상 발생 (Delete Anomaly)

필요한 데이터를 삭제하는 과정에서 원하지 않는 정보까지 함께 삭제되는 문제이다.

만약 김철수가 수강 취소를 하게 되어 해당 행을 삭제 할 경우

학생 정보 뿐만 아닌 과목 정보와 교수 정보도 함께 사라지게 된다.

즉, 학생의 수강정보만 삭제했을 뿐인데 교수 정보까지 모두 잃어버리게 되는 문제가 발생한다.


제 1정규형 (1NF)

제 1정규형은 테이블의 모든 컬럼이 원자값을 가지도록 만드는 것이다.

※ 원자값 : 더 이상 나눌 수 없는 하나의 값.

 

예를 들어 아래 표 이미지와 같이 하나의 컬럼에 여러개의 값을 저장할 수 없는 방식이다.

즉, 하나의 셀에는 하나의 값만 저장되어야 한다.


제 2정규형 (2NF)

제 2정규형은 제 1정규형을 만족하면서 부분 함수 종속을 제거하는 단계이다.

쉽게 말해 복합 기본키의 일부에만 의존하고 있는 컬럼을 분리 하는 것이다.

 

아래의 표를 예시로 들면

정규화 전에는 학생이름은 학생 ID만 알면 결정될 수 있지만

학생 ID, 과목ID라는 복합키에 포함이 되어있다.

 

그래서 정규화를 진행하여 중복 저장이 되던 학생 이름을 제거할 수 있다.


제 3정규형 (3NF)

제 3정규형은 제 2정규형을 만족하면서 이행적 함수 충족을 제거하는 단계이다.

쉽게 말해 기본키가 아닌 컬럼이 또 다른 컬럼을 결정하고 있는 관계를 제거해주는것이다.

 

아래 테이블을 보면 교수 연락처는 교수 ID에 의해 결정이 되는 구조이다. (과목 ID 아님)

즉, 과목 ID → 교수ID → 교수 연락처 관계가 존재하고 있다.

 

그래서 정규화를 진행하여 이행 종속을 제거해 데이터 중복을 줄일 수 있다.


제 4정규형 (4NF)

제 4정규형은 다치 종속을 제거하는 단계이다.

하나의 엔터티가 서로 독립적인 여러 값을 동시에 가지게 될 때

발생할 수 있는 중복을 제거하는 역할을 한다.

※ 다치 종속 : 하나의 결정자(학생)에 대해 독립적인 여러 값(언어, 자격증)이 존재하는 것

 

아래 테이블을 보면 

한 학생이 여러 프로그래밍 언어와 여러 자격증을 가지고 있다.

실제로 언어와 자격증은 서로 관계가 없지만 모든 조합이 저장되고 있다.

그렇기 때문에 언어 테이블과 자격증 테이블로 분리하여 해결할 수 있다.


정규화의 단점과 해결방안(반정규화)

📌 정규화의 단점

정규화를 진행하다보면 데이터의 중복은 줄일 수 있지만

테이블 수가 증가하는 경우가 많다.

 

테이블 수가 증가하여 데이터를 조회할 때 여러 테이블을 JOIN해야 하고

쿼리가 복잡해지기 때문에 성능이 느려질 수 있다.

 

특히 조회를 많이 해야하는 서비스에선 JOIN을 하는 과정에서 속도가 많이 저하될 수 있다.


반정규화 ( De-normalization)

반정규화는 조회 성능 향상을 위해서

일부 중복을 허용하는 방법이다.

 

정규화 과정에서 분리하였던 데이터를 다시 합치거나

중복 저장을 허용하여 JOIN 횟수를 줄여준다.

 

즉, 데이터 중복을 허용하는 대신 조회 성능을 얻는 방식이다.

 

💡 반정규화 언제 사용할까?

  • 조회 수가 많은 서비스
  • 통계 및 분석 시스템
  • 실시간 조회 성능이 중요한 서비스
  • JOIN이 너무 많아 성능 문제가 발생하는 서비스

대표적으론 쇼핑몰 상품 목록, 게시판 목록, 통계 페이지에서 주로 활용되고 있다.


정규화 코드 예시

비정규화 테이블

CREATE TABLE student_course (
    student_id INT,
    student_name VARCHAR(50),
    course_name VARCHAR(50),
    professor_name VARCHAR(50),
    professor_phone VARCHAR(20)
);

 

정규화 된 테이블구조

수정필요!!!!!!!!!!!!!!!!!!!!!!

-- 1) 학생 테이블
CREATE TABLE student (
    student_id INT primary key,    -- PK로 id 저장
    student_name VARCHAR(50)
);

-- 2) 교수 테이블
CREATE TABLE professor(
    professor_id INT primary key,    -- id 새로 생성 + PK 저장
    professor_name VARCHAR(50),
    professor_phone VARCHAR(20)
);

-- 3) 과목 테이블
CREATE TABLE course (
    course_id INT primary key,	-- id 새로 생성 + PK 저장
    course_name VARCHAR(50),
    professor_id INT, 		-- 교수에 대한 값 연결
    foreign key (professor_id) references professor(professor_id) 	-- 외래키 제약조건
);

-- 4) 수강 테이블
CREATE TABLE enroll (
    student_id INT,	-- 누가 수강했는지?
    course_id INT,	-- 어떤 과목을 수갈했는지?
    primary key (courde_id),	-- 기본키
    foreign key (student_id) references student(student_id),	-- 외래키 제약조건 1
    foreign key (course_id) references cours(course_id)		-- 외래키 제약조건 2
);

정리

정규형 목적
1NF 컬럼 값을 원자값으로 분리
2NF 부분 함수 종속 제거
3NF 이행 함수 종속 제거
4NF 다치 종속 제거