데이터베이스 정규화는 데이터를 효율적이고 무결성 있게 저장하기 위한 방법입니다. 정규화는 여러 단계로 나뉘며, 각 단계는 데이터 중복을 줄이고 데이터 무결성을 보장하기 위한 특정한 규칙을 따릅니다. 여기서는 제 1 정규형부터 제 5 정규형까지, 그리고 BCNF(보이스-코드 정규형)에 대해 설명하겠습니다.
두 -> 부 -> 이 -> 결 -> 다 -> 조

제 1 정규형 (1NF)
모든 열이 원자값(더 이상 나눌 수 없는 값)을 가져야 합니다. 즉, 각 열은 하나의 값만을 가져야 합니다.
예시:
- 비정규화된 테이블: (학생ID, 이름, 전화번호) -> 1, 홍길동, "010-1234-5678, 010-8765-4321"
- 1NF 테이블: (학생ID, 이름, 전화번호) -> 1, 홍길동, 010-1234-5678; 1, 홍길동, 010-8765-4321
제 2 정규형 (2NF)
제 1 정규형을 만족하면서 부분적 함수 종속성을 제거해야 합니다. 즉, 모든 비주요 속성이 기본 키에 대해 완전 함수 종속적이어야 합니다.
예시:
- 비정규화된 테이블: (학생ID, 과목, 교수명) -> 학생ID가 과목과 교수명 둘 다의 기본 키일 때 교수명은 과목에 종속적입니다.
- 2NF 테이블: (학생 테이블: 학생ID, 과목); (과목 테이블: 과목, 교수명)
제 3 정규형 (3NF)
제 2 정규형을 만족하면서 이행적 함수 종속성을 제거해야 합니다. 즉, 기본 키가 아닌 속성이 다른 기본 키가 아닌 속성에 종속되지 않아야 합니다.
예시:
- 비정규화된 테이블: (학생ID, 과목, 교수명, 교수전화번호) -> 교수전화번호는 교수명에 종속적입니다.
- 3NF 테이블: (학생 테이블: 학생ID, 과목); (과목 테이블: 과목, 교수명); (교수 테이블: 교수명, 교수전화번호)
보이스-코드 정규형 (BCNF)
BCNF는 제 3 정규형보다 더 강력한 정규형입니다. 모든 결정자가 후보 키(candidate key)여야 합니다. 결정자란 다른 속성들을 고유하게 결정할 수 있는 속성을 말합니다.
예시:
- 비정규화된 테이블: (학생ID, 과목, 교수명) -> 한 학생이 여러 과목을 듣고, 각 과목마다 다른 교수가 있을 때
- BCNF 테이블: (학생 테이블: 학생ID, 과목); (교수 테이블: 과목, 교수명)
제 4 정규형 (4NF)
제 4 정규형은 다치 종속성을 제거하는 것을 목표로 합니다. 다치 종속성이란 한 속성이 다른 속성에 독립적으로 종속되는 경우를 말합니다.
예시:
- 비정규화된 테이블: (학생ID, 과목, 프로젝트) -> 학생이 여러 과목과 여러 프로젝트를 수행하는 경우
- 4NF 테이블: (학생-과목 테이블: 학생ID, 과목); (학생-프로젝트 테이블: 학생ID, 프로젝트)
제 5 정규형 (5NF)
제 5 정규형은 조인 종속성을 제거하는 것을 목표로 합니다. 조인 종속성이란 테이블을 여러 개로 분해했을 때, 이들 테이블을 다시 조인하여 원래의 테이블을 완벽하게 재구성할 수 있는 경우를 말합니다.
예시:
- 비정규화된 테이블: (학생ID, 과목, 교수명, 프로젝트) -> 학생이 여러 과목을 듣고, 각 과목마다 다른 교수가 있으며, 프로젝트도 여러 개 있을 때
- 5NF 테이블: (학생-과목 테이블: 학생ID, 과목); (과목-교수 테이블: 과목, 교수명); (학생-프로젝트 테이블: 학생ID, 프로젝트)
이렇게 각 정규형 단계는 데이터베이스의 중복과 불일치를 줄이고, 데이터 무결성을 유지하기 위한 규칙을 제공합니다. BCNF와 제 4, 제 5 정규형은 매우 복잡한 데이터베이스 구조에서 더 많이 사용됩니다.
'DB' 카테고리의 다른 글
JDBC로 배우는 단계별 프로젝트 개발: Ver 3과 Ver 4를 통해 얻은 깨달음 🚀 (0) | 2025.01.06 |
---|---|
JDBC로 배우는 단계별 프로젝트 개발: Ver 1과 Ver 2를 통해 얻은 깨달음 🚀 (1) | 2024.12.19 |
SQLD ) 데이터 모델링 (1) | 2023.11.09 |