본문 바로가기

클라우드(Cloud)

[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 4주차 - DB3 (데이터베이스3 - 정규화 中 1NF, 2NF, 3NF, BCNF, 4NF)

 

지난 데이터베이스 개념 정리로 이해가 되는 내용이 많아졌을 것이라 생각한다. 이번에는 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) 리뷰로 작성 되었습니다.