지난 데이터베이스 개념 정리로 이해가 되는 내용이 많아졌을 것이라 생각한다. 이번에는 DB를 어떻게 해야 조금 더 효율적으로 활용할 수 있고, 데이터의 중복을 제거하고, 무결성을 유지하는 등의 특징을 유지할 수 있는 방법인 정규화에 대해 이해해보려 한다.
🧱 정규화(Normalization)
1️⃣ 정규화란?
정규화(Normalization)는 중복을 최소화하고, 데이터 무결성을 유지하기 위해 테이블을 작게 나누고(분해) 테이블 간 관계를 설정하는 과정이다.
2️⃣ 정규화를 해야 하는 이유
이유 | 설명 |
✅ 데이터 중복 제거 | 동일한 정보가 여러 테이블에 저장되면 변경 시 오류 발생 가능 |
✅ 무결성 유지 | 한 곳만 수정하면 일관성이 유지됨 |
✅ 저장 공간 절약 | 중복 데이터로 낭비되는 공간 최소화 |
✅ 이상현상 방지 | 아래에서 설명할 삽입/삭제/갱신 이상(Anomaly) 방지 |
✅ 구조적 명확성 | 테이블 간 관계가 명확해지고 관리가 쉬워짐 |
3️⃣ 이상현상(Anomaly)이란?
종류 | 설명 | 예시 |
삽입 이상 (Insertion Anomaly) | 어떤 데이터를 삽입하려고 해도 다른 정보가 없으면 불가능 | 새로운 과목을 등록하려고 했지만 수강생 정보가 없어 등록 불가 |
삭제 이상 (Deletion Anomaly) | 데이터를 삭제할 때 원치 않는 정보도 같이 삭제 | 한 학생을 삭제했더니 과목 정보도 함께 삭제됨 |
갱신 이상 (Update Anomaly) | 중복된 데이터를 수정할 때 일부만 바뀌면 불일치 발생 | 강사의 전화번호를 한 군데만 수정함 |
4️⃣ 정규화의 단계별 설명 + 예시
여기서는 "학생-과목" 테이블을 예시로 이해해볼 것이다.
✅ 0NF (비정규형)
- 구조 없음
- 하나의 필드에 여러 값이 저장된 상태
| 학생 | 과목 |
|-----|---------------|
| 서연 | 수학, 영어, 과학 |
➜ 하나의 셀에 여러 데이터가 있음 → 정규화 필요하다는 것을 알 수 있다.
✅ 1NF (제1 정규형)
모든 컬럼이 원자값(atomic value)을 가져야 한다.
→ 즉, 위의 예시와 다르게 테이블 컬럼이 하나의 값만을 갖도록 분리해내는 과정이다.
아래의 규칙들을 만족해야한다.
1. 각 컬럼이 하나의 속성(원자값)만을 가져야 한다.
2. 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
3. 각 컬럼이 유일한(unique) 이름을 가져야 한다.
4. 컬럼의 순서가 상관없어야 한다.
예시:
| 학생 | 과목 |
|-----|-----|
| 서연 | 수학 |
| 서연 | 영어 |
| 서연 | 과학 |
예시의 테이블을 보면 각 컬럼이 하나의 값만을 가지고 있으므로 정규화를 진행했다고 할 수 있다.
✅ 2NF (제2 정규형)
1NF 만족 + 부분 함수 종속 제거
즉, 테이블의 모든 컬럼이 완전 함수 종속을 만족하도록 하는 과정이다.
부분 함수 종속 = 복합 기본키의 "일부"에만 종속된 속성
이해하기 쉽게 말하자면, 테이블에서 기본키가 복합키로 묶여는 경우에 두 키 중 하나의 키 만으로 다른 컬럼이 결정되는 상황이 나와서는 안된다는 의미이다.
예시: 수강 테이블 (학생ID + 과목명 = 복합키)
| 학생ID | 과목명 | 학과명 |
여기서 학과명은 학생ID에만 종속되기에 테이블을 분리해주어야 한다.
분해 후:
- 학생 테이블: (학생ID, 학과명)
- 수강 테이블: (학생ID, 과목명)
✅ 3NF (제3 정규형)
2NF 만족 + 이행적 함수 종속 제거
이행적 종속 = A → B, B → C 인 경우 A → C가 되는 상황
예시:
| 학번 | 과목 | 교수 | 교수 전화번호 |
교수 전화번호는 교수 이름에 종속됨 → 학번이 바뀌는데 교수 전화번호가 왜 바뀌는지?
분해 후:
- 수강 테이블: (학번, 과목, 교수)
- 교수 테이블: (교수, 전화번호)
사실 현실에서는 제 2정규화나 제 3정규화까지 실행되는 경우는 다수 있지만 그 이상으로 넘어가게 되는 일은 잘 없다고 한다.
아래의 정규형들은 알아두기 정도만 해도 좋을 것으로 생각된다.
✅ BCNF (보이스-코드 정규형)
BCNF는 강화된 제3정규형으로 생각하면 이해하기 편하다.
3NF를 만족하지만 후보키가 아닌 속성이 결정자(Determinant)가 되는 경우 분해한다.
예시:
| 교수 | 강의실 | 수업시간 |
➜ 교수 → 강의실, 강의실 → 수업시간
강의실이 후보키가 아니어도 결정자 역할을 하면 BCNF 위반이다.
✅ 4NF (제4 정규형)
다치 종속(Multi-valued Dependency) 제거
예시:
| 학생 | 전화번호 | 이메일 |
➜ 하나의 학생이 여러 전화번호, 여러 이메일을 가짐 → 두 속성이 독립적으로 반복됨
→ 학생-전화번호, 학생-이메일 테이블로 분해해야 함
위에서 말했듯이 제3정규형 이상으로 정규화를 진행하게 되면, 정규화의 단점이 부각되어 나타날 수 있기에 보통은 그 전까지만 실행한다.
본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.