데이터베이스를 공부하다 보면 “테이블을 정규화하세요”라는 말을 자주 듣게 됩니다.
그런데 왜 굳이 테이블을 잘게 나누는 걸까요? 그냥 하나에 다 넣으면 안 될까요?
오늘은 그 궁금증을 풀어보며, 데이터베이스의 정규화(Normalization)가 무엇인지,
왜 필요한지, 그리고 정규형의 종류와 각각 어떤 조건을 가지는지 살펴볼게요.
💡 정규화란?
정규화(Normalization)는 데이터의 중복을 최소화하고, 일관성과 무결성을 유지하기 위해 테이블 구조를 체계적으로 분해하는 과정입니다.
데이터베이스를 처음 설계할 때, 하나의 테이블에 많은 정보를 넣으면 편해 보일 수 있지만,
이렇게 구성된 테이블은 중복 데이터가 많아지고, 데이터 수정/삭제 시 여러 문제(이상, anomaly)가 발생할 수 있습니다.
❌ 정규화가 안 된 테이블의 문제
아래는 정규화가 되지 않은 예시입니다
주문 ID | 고객명 | 고객주소 | 상품명 | 상품가격 |
1 | 김영희 | 서울시 | 키보드 | 30,000 |
2 | 김영희 | 서울시 | 마우스 | 15,000 |
- 고객 정보가 중복 저장되고 있음
- 고객 주소가 바뀌면 모든 행을 수정해야 함
- 주문/상품/고객 간의 역할이 섞여 있음
이런 문제들이 데이터 이상(anomaly)입니다.
✅ 제1정규형 (1NF): 컬럼은 원자값만 가진다
- 각 셀에는 더 이상 쪼갤 수 없는 값만 있어야 함
- 반복되는 그룹 금지 (ex: "상품1, 상품2" 같이 한 셀에 여러 값 X)
고객명 | 전화번호 ❌ |
홍길동 | 010-1234-5678, 1111 |
→ 아래처럼 분리해야 함
고객명 | 전화번호 ✅ |
홍길동 | 010-1234-5678 |
홍길동 | 1111 |
✅ 제2정규형 (2NF): 부분 종속 제거
- 기본 키의 일부에만 종속된 컬럼 제거
- 즉, 기본 키가 복합 키일 때만 해당
- 컬럼은 전체 기본 키에 종속되어야 함
주문ID | 상품ID | 고객명 ❌ |
1 | A | 홍길동 |
→ 고객명은 주문ID에만 종속되므로 분리 필요
✅ 제3정규형 (3NF): 이행적 종속 제거
- 기본 키가 아닌 컬럼 간의 종속 제거
- 즉, 기본 키 → A → B 구조일 때, B는 다른 테이블로 분리
고객ID | 고객명 | 고객등급 ❌ |
1 | 홍길동 | Gold |
→ 고객등급은 고객명에 의해 결정되므로 분리
🔵 BCNF (보이스-코드 정규형, Boyce-Codd Normal Form)
- 3NF보다 조금 더 엄격한 형태
- 모든 결정자가 후보 키여야 한다
✔ 언제 필요하냐면?
복합키가 있을 때, 일부 속성이 후보 키가 아닌 속성에 영향을 미치는 경우
→ 결정자가 후보 키가 아닐 때 발생하는 이상 제거
→ 실무에서 3NF와 함께 다뤄지는 경우 많음
🟣 4NF (Fourth Normal Form)
- 다치 종속(Multi-valued Dependency) 제거
- 한 테이블에 서로 독립적인 반복 그룹이 두 개 이상 존재할 경우 분리해야 함
✔ 예:
한 고객이 여러 주소와 여러 연락처를 동시에 가질 경우
→ 주소와 연락처는 서로 독립적이기 때문에 분리 필요
🟤 5NF (Fifth Normal Form) 또는 PJ/NF
- 조인 종속(Join Dependency) 문제 해결
- 분해된 테이블들을 조인했을 때, 원래의 테이블이 정확히 복원되어야 함
✔ 아주 복잡한 관계에서만 등장, 실무에서는 거의 쓰이지 않음
⚪ 6NF (Sixth Normal Form)
- 시간에 따른 데이터 변경까지 정규화
- 데이터 웨어하우스, 시계열 데이터 처리 등에서 등장
✔ 거의 쓰이지 않지만, 시계열 DB 등에서는 활용
🛠 왜 정규화가 중요할까?
- 데이터 중복 줄이기
- 저장 공간 절약
- 변경 시 일관성 유지
- 삽입/삭제/갱신 이상(anomaly) 방지
정규화는 마치 데이터의 ‘정리정돈’ 습관과 같아요.
처음엔 번거로워 보여도, 잘 정리된 구조가 나중엔 유지보수와 성능을 결정짓게 됩니다.
✅ 정규형 전체 요약표
정규형 | 핵심 조건 | 언제 필요한가 |
1NF | 컬럼이 원자값만 가짐 | 기본 중복 제거 |
2NF | 부분 종속 제거 | 복합 기본 키일 때 |
3NF | 이행적 종속 제거 | 대부분의 일반적 설계 상황에서 |
BCNF | 모든 결정자가 후보 키 | 후보 키 아닌 결정자 존재 시 |
4NF | 다치 종속 제거 | 독립적 반복 데이터가 있는 경우 |
5NF | 조인 종속 제거 | 아주 복잡한 분해/재조합 상황 |
6NF | 시간 종속성까지 고려한 정규화 | 시계열, 로그성 데이터 등 특수처리 |
정규화는 단순히 “테이블을 나눈다”는 것이 아니라,
데이터 간의 관계와 의존성을 명확히 정리하는 과정입니다.
3NF까지는 거의 모든 테이블 설계에 유용하고, 그 이후는 특정 복잡한 케이스에서의 최적화라고 보면 됩니다.
완벽한 정답이 있는 건 아니지만, 데이터를 잘 이해하고 적절히 구조화하는 연습을 통해
더 효율적이고 튼튼한 데이터베이스를 만들 수 있어요.
👀 데이터베이스에 대한 다른 포스팅도 궁금하시다면 아래의 글을 추천해요
[SQL] SQL 조인의 종류
SQL(Structured Query Language)에서 조인(JOIN)은 여러 테이블에서 데이터를 결합하고 관련 정보를 가져오는 데 사용됩니다. 데이터베이스 설계 시 데이터를 여러 테이블로 나누어 관리하는 것이 일반적
dev-yeonwha.tistory.com
'데이터베이스' 카테고리의 다른 글
[DB] 데이터베이스 인덱스(Index)란? (1) | 2025.05.09 |
---|---|
[DB] 자주 쓰는 SQL 쿼리 패턴 10가지 정리 (0) | 2025.05.08 |
[DB] 데이터베이스 키(Key)의 개념과 종류 (0) | 2025.04.11 |
[SQL] SQL 조인의 종류 (0) | 2025.01.08 |