본문 바로가기
DB

데이터베이스 1,2,3 정규화 개념

by 정권이 내 2025. 6. 7.

데이터베이스 1,2,3 정규화

 

정규화는 중복 최소화와 데이터 무결성 확보를 위해 필수적인 개념입니다.

1NF, 2NF, 3NF 각각 1정규화 부터 3정규화까지의 원칙과 예시를 통해 학습 해보겠습니다.

 

1. 정규화란?

정규화(Normalization) 는 관계형 데이터베이스에서 중복을 줄이고 데이터 일관성을 유지하기 위해 테이블을 구조적으로 분해하는 과정입니다.

  • 중복 데이터 제거
  • 이상현상(삽입, 삭제, 갱신 이상) 방지
  • 데이터 무결성 유지
  • 유지 보수 용이

 

정규화는 단계적으로 진행되며 1NF -> 2NF -> 3NF 까지 적용하는것이 일반적입니다.

 

1NF : 제 1정규화 (원자값)

1정규화는 모든 속성이 원자값(Atomic Value)만 가져야 한다는 원칙 입니다.

원자값이란 하나의 셀에는 하나의 값만 있어야 한다는 뜻입니다.

 

1정규화 위반 예시

학생ID이름수강과목
1홍길동수학, 영어
2이몽룡과학
  • 1번학생의 수강과목 컬럼에 수학과 영어라는 값 2개가 존재

 

1정규화 적용

학생ID이름수강과목
1홍길동수학
1홍길동영어
2이몽룡과학

 

2NF : 제 2정규화 (부분함수 종속 제거)

2NF는 1NF를 만족하면서 테이블의 기본키를 제외한 속성이 모두 기본키에 종속되어야 한다는 원칙 입니다.

 

2정규화 위반 예시

학생ID과목교수이름
1수학김교수
1영어이교수
  • 이 테이블의 PK는 (학생 ID, 과목) 으로 이루어진 복합키 형태
  • 교수이름은 과목에 종속적인 성격이라 복합키(학생 ID, 과목) 에서 학생에는 종속적이지 않음

 

2정규화 적용

학생 수강 테이블

학생ID과목
1수학
1영어

 

교수 과목 테이블

과목교수이름
수학김교수
영어이교수
  • 과목정보와 교수이름을 따로 관리하는 테이블 생성하여 부분 종속성 제거

 

3NF : 제 3정규화 (이행적 함수 종속성 제거)

3NF는 2NF를 만족하고 기본키가 아닌 컬럼이 다른 일반적인 속성에 종속되지 않아야 하는 원칙 입니다.

 

3정규화 위반 예시

학생ID학과ID학과이름
110컴퓨터공학
220경영학
  • 테이블의 기본키는 학생ID 라고 할때 학과 ID는 학생ID에 종속적이고 학과이름은 학과ID에 종속적입니다.
  • 학과이름 => 학과ID => 학생ID : 이행적 종속

 

3정규화 적용

학생 정보 테이블

학생ID학과ID
110
220

 

학과 정보 테이블

학과ID학과이름
10컴퓨터공학
20경영학

 

2. 이상현상 방지와 정규화의 필요성

정규화의 목적중 하나는 이상현상(Anomaly)을 방지하는 것입니다.

이상현상이란 데이터의 중복 또는 구조적 결함때문에 정상적인 데이터 삽입/수정/삭제가 불가능하거나 이상하게 동작하는 것입니다.

 

이상현상의 종류

유형설명
삽입 이상데이터 일부만으로는 삽입 불가능 (예: 교수이름만 알고 있는데 과목이 없으면 못 넣음)
삭제 이상하나의 정보 삭제가 다른 정보까지 제거함 (예: 수강정보 삭제 시 교수이름까지 삭제)
갱신 이상중복 데이터가 많아 일괄 수정이 어려움 (예: 교수이름 수정 시 여러 행을 수정해야 함)

 

삽입 이상

학생ID학생명수강과목
1철수수학
2영희영어

위와 같은 테이블이 있을때 새로운 과목만 추가하고 싶을경우 문제가 발생합니다.

학생ID가 기본키이기 때문에 기본키를 채우지 않고 일반 속성의 데이터만 삽입할수는 없기 때문입니다.

 

제 2정규화(부분함수 종속 제거) 방식으로 과목을 관리하는 테이블을 별도로 생성하여 관리하면 됩니다.

과목ID과목명
1수학
2영어
3과학

 

삭제 이상

학생ID학생명수강과목
1철수수학
2영희영어

학생정보 테이블에서 영희의 영어 수강을 취소할경우 행을 삭제하면 영희의 데이터가 전부 삭제되어 데이터 손실이 발생합니다.

제 2정규화 (부분함수 종속 제거)를 통해서 해결할수 있습니다.

 

학생 테이블

학생ID학생명
1철수
2영희

 

수강 테이블

학생ID과목
1수학
2영어

이처럼 학생ID를 FK로 사용하는 수강 테이블을 별도로 관리하면 해결 가능합니다.

반응형

'DB' 카테고리의 다른 글

[ORACLE] SID, ServiceName 개념과 차이점  (0) 2024.11.06
[DB] ORACLE, MYSQL 날짜, 시간 관련 함수  (0) 2023.10.10

댓글