본문 바로가기
Daily Dev Q&A 정리 템플릿

25.12.17 정규화에 대해서 설명해주세요.

by teg0 2025. 12. 17.

DB 테이블을 만들 때, 정규화를 한 번쯤 볼 수 있을 것이다.

그래서 정규화가 무엇인지 모르고 테이블을 구성할 때가 있다고 생각한다.

나 또한 프로젝트를 진행하면서, 정규화를 잊고 지키지 않은 적이 몇 번있다.

그래서...

 

정규화란?

데이터 중복을 줄이고, 데이터 변경 시 발생할 수 있는 이상 현상을 방지하기 위해 테이블을 구조적으로 분해하는 과정이다.

쉽게 말하면, 데이터가 중구난방으로 섞여 있는 큰 엑셀 파일을, 주제별로 깔끔하게 작은 파일 여러 개로 나누고 서로 연결하는 것이다.

 

왜 정규화를 하는가?

정규화를 하지 않으면 다음과 같은 이상현상(Anomaly)이 발생된다.

  • 삽입 이상: 데이터를 넣을 때 불필요한 값도 억지로 넣어야 한다.
  • 삭제 이상: 데이터를 지울 때 필요한 다른 정보까지 같이 지워진다.
  • 갱신 이상: 중복된 데이터 중 일부만 수정되어 데이터 불일치가 발생한다.

 

제1 정규화 (1NF)

규칙: 테이블의 칼럼(속성)은 반드시 원자값(Atomic Value) 하나만 가져야 한다.

예를 들어 한 학생의 수강과목을 복수로 신청했다면, 한 행이 아닌 다 행으로 분해해야 한다.

1NF 위반 예시

학생ID 학생명 수강과목
1 홍길동 DB, Java

이 테이블을 보면, 한 칸에 두 개의 값이 들어가기 때문에 하나만 들어가도록 분리한다.

1NF 적용

학생ID 학생명 수강과목
1 홍길동 DB
1 홍길동 Java

 

제2 정규화 (2NF)

 규칙: 1NF인 원자값을 가진 상태에서 부분 함수 종속 제거를 한다.(복합 PK 일경우. PK 일부에만 종속된 칼럼 제거)

기본키가 복합키(두 개 이상의 칼럼) 일 때, 키 전체가 아니라 키의 일부에만 의존하는 칼럼을 따로 떼어낸다.

 

2NF 위반 예시

수강 테이블 (PK: 학생 ID + 과목명)

학생ID 과목명 학생명
1 DB 홍길동
1 Java 홍길동

학생명은 학생 ID에만 종속됨

 

2NF 적용

학생 테이블

학생ID 학생명
1 홍길동

 

수강 테이블

학생ID 학생명
1 DB
1 Java

PK 전체에 의존하도록 분리

 

제3 정규형 (3NF)

규칙: 2NF를 만족하면서, 이행 함수 종속 제거해야 한다.( A → B → C 구조 제거 )

기본키가 아닌 일반 칼럼끼리 의존하는 관계를 분리한다.

3NF 위반 예시

학생ID 학과ID 학과명
1 D01 컴퓨터공학
2 D01 컴퓨터공학

 

  • 학생 ID → 학과 ID
  • 학과 ID → 학과명
    이행 종속 발생

 

3NF 적용

학생 테이블

학생ID 학과ID
1 D01
2 D01

 

 

학과 테이블

학과ID 학과명
D01 컴퓨터공학

 

BCNF (Boyce-Codd Normal Form)

규칙: 3NF를 만족하고, 모든 결정자가 후보키(Candidate Key)여야 한다.

3NF보다 더 엄격한 단계로, 기본키가 아닌 일반 칼럼이 기본키의 일부를 결정하는 경우를 분리한다.

학과ID 학과명 교수
D01 컴퓨터공학 홍교수

이라면, 기본키는 (학과 ID와 학과명)이다. 그리고 기본키는 교수를 결정하고 있다.

또한 여기서 교수는 학과명을 결정하고 있다.

그런데 문제는 교수가 학과명을 결정하는 결정자이지만, 후보키가 아니라는 점이다. 그렇기 때문에 BCNF 정규화를 만족시키기 위해서 위의 테이블을 분해해야 한다.

학과ID 교수
D01 홍교수
학과명 교수
컴퓨터공학 홍교수