데이터 정규화는 중복을 최소화하고 데이터의 일관성을 유지하기 위해 테이블을 쪼개는 과정입니다. 요청하신 세 가지 핵심 개념을 단계별로 정의, 비유, 예시와 함께 정리해 보았습니다.
< 목 차 >
1. 원자성 (Atomicity) & 제1정규형 (1NF)
2. 제2정규형 (2NF)
3. 제3정규형 (3NF)
4. 요약 정리
1. 원자성 (Atomicity) & 제1정규형 (1NF)
- 정의: 모든 속성(컬럼)은 반드시 하나의 값만 가져야 한다는 원칙입니다. 즉, 하나의 칸에 여러 개의 데이터를 넣어서는 안 되는, 관계형 데이터베이서에서 테이블의 모든 속성이 원자값(Atomic Value)만을 갖도록 설계하는 과정입니다. 또한 단순히 한 칸에 여러 값이 들어있는 경우뿐만 아니라, '수강과목1, 수강과목2, 수강과목3'처럼 동일한 성격의 속성이 중복되어 나타나는 반복 그룹을 제거하여 별도의 엔터티로 분리하는 작업도 포함됩니다.
- 비유: 과일 바구니 하나에는 반드시 '사과' 혹은 '배' 하나만 담아야지, '사과와 배'를 한꺼번에 구겨 넣어서는 안 된다는 것과 같습니다.
< 예시 >
- 정규화 전: `[학생명: 김철수, 수강과목: 수학, 영어]` → '수강과목' 칸에 값이 두 개 들어있음.
- 정규화 후: ↓
`[학생명: 김철수, 수강과목: 수학]`
`[학생명: 김철수, 수강과목: 영어]` → 한 줄에 하나의 과목만 적어 원자성을 확보합니다.
2. 제2정규형 (2NF)
- 정의: 제1정규형을 만족하면서, '부분 함수 종속'을 제거한 상태입니다. 기본키(PK)가 여러 개의 속성으로 합쳐져 있을 때(복합키), 기본키 전체가 아닌 일부분에만 의존하는 속성이 있다면 이를 분리해야 합니다.
- 비유: 커플이 공동 명의로 집을 샀는데, 집 안에 '남편의 개인 취미 용품'이 들어있는 것과 같습니다. 이 물건은 커플 공동의 것이 아니라 남편 개인에게만 속한 것이므로 따로 보관해야 합니다.
< 예시 >
- 기본키: `[학번 + 과목코드]`
- 속성: `[성적, 과목명]`
- 문제: '성적'은 `학번`과 `과목코드`가 모두 있어야 결정되지만, '과목명'은 `과목코드` 하나만 알아도 알 수 있습니다. 즉, 기본키의 일부분(`과목코드`)에만 종속됩니다.
- 해결: `[학번, 과목코드, 성적]` 테이블과 `[과목코드, 과목명]` 테이블로 분리합니다.
3. 제3정규형 (3NF)
- 정의: 제2정규형을 만족하면서, '이행 함수 종속'을 제거한 상태입니다. 기본키가 아닌 일반 속성들끼리 서로 의존하는 관계(징검다리 관계)를 끊어주는 과정입니다.
- 비유: "A를 알면 B를 알고, B를 알면 C를 안다"는 관계에서 A와 C는 직접적인 사이가 아닙니다. 중간에 낀 B 때문에 생기는 관계이므로, B와 C를 별도의 방으로 독립시켜 주는 것입니다.
< 예시 >
- 기본키: `[사원번호]`
- 일반 속성: `[소속부서코드, 부서명]`
- 문제: 사원번호를 알면 부서코드를 알 수 있고, 부서코드를 알면 부서명을 알 수 있습니다. `사원번호 → 부서코드 → 부서명`의 징검다리 구조가 생깁니다.
- 해결: `[사원번호, 소속부서코드]` 테이블과 `[소속부서코드, 부서명]` 테이블로 분리하여 관리합니다.
4. 💡 요약 정리
1. 제1정규형 (원자성): 한 칸에 값은 무조건 하나!
2. 제2정규형: 기본키가 여러 개일 때, 일부분에만 매달려 있는 녀석들을 분리!
3. 제3정규형: 일반 속성들끼리 징검다리() 건너서 의존하는 녀석들을 분리!
끝!
'IT Python 코딩 학습과정' 카테고리의 다른 글
| [AICE ASSOCIATE] 오픈 배지 수령 (0) | 2026.01.07 |
|---|---|
| [자격증] AICE ASSOCIATE 자격시험 100점 합격 후기 (0) | 2026.01.03 |