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 | 홍교수 |
| 학과명 | 교수 |
| 컴퓨터공학 | 홍교수 |
'Daily Dev Q&A 정리 템플릿' 카테고리의 다른 글
| 25.12.22 스프링 프레임워크이란? (0) | 2025.12.22 |
|---|---|
| 25.12.19 트랜잭션에 대해 알아보기 (1) | 2025.12.19 |
| 25.12.16 자바의 람다 표현식이란? (0) | 2025.12.16 |
| 25.12.15 RDBMS는 무엇일까? (1) | 2025.12.15 |
| 25.12.12 프레임워크가 무엇이고 무엇을 사용했나요? 라는 질문에 대해 정리하기 (0) | 2025.12.14 |