이번 포스팅에서는 정규화(Normalization) 과정을
실제 학생-과목 성적 데이터를 통해 1NF → 2NF → 3NF + BCNF까지단계별로 실습하며 각 단계에서 발생하는 부분적 종속, 이행적 종속 등의 문제를 해결하는 방법을 정리!
| STUDENT_ID | COURSE_ID | GRADE | STUDENT_NM | DEPARTMENT | fees |
|---|---|---|---|---|---|
| 1 | CSE011101, CSE022202, CSE033303 | A+, A, B+ | hongildong | 컴퓨터공학부 | 5000000 |
| 2 | MEC011101 | A | hongildong2 | 경영학부 | 4000000 |
| 3 | POD032939 | C | hongildong3 | 기계공학부 | 6000000 |
문제점:
- 한 셀에 여러 값 (다중값)
- 학생정보 중복
- 등록금(fees)이 학부에 종속
목표: 모든 컬럼이 원자값(하나의 값)만 가지도록 분리
| STUDENT_ID | COURSE_ID | GRADE | STUDENT_NM | DEPARTMENT | fees |
|---|---|---|---|---|---|
| 1 | CSE011101 | A+ | hongildong | 컴퓨터공학부 | 5000000 |
| 1 | CSE022202 | A | hongildong | 컴퓨터공학부 | 5000000 |
| 1 | CSE033303 | B+ | hongildong | 컴퓨터공학부 | 5000000 |
| 2 | MEC011101 | A | hongildong2 | 경영학부 | 4000000 |
| 3 | POD032939 | C | hongildong3 | 기계공학부 | 6000000 |
개선점
COURSE_ID,GRADE를 행 단위로 분리- 부분 함수 종속 발생:
(STUDENT_ID, COURSE_ID)가 기본키인데,STUDENT_NM,DEPARTMENT,fees는STUDENT_ID에만 종속
목표: 비기본키 속성이 기본키 전체에만 함수 종속되도록 테이블 분리
| STUDENT_ID | COURSE_ID | GRADE |
|---|---|---|
| 1 | CSE011101 | A+ |
| 1 | CSE022202 | A |
| 1 | CSE033303 | B+ |
| 2 | MEC011101 | A |
| 3 | POD032939 | C |
| STUDENT_ID | STUDENT_NM | DEPARTMENT | fees |
|---|---|---|---|
| 1 | hongildong | 컴퓨터공학부 | 5000000 |
| 1 | hongildong | 컴퓨터공학부 | 5000000 |
| 1 | hongildong | 컴퓨터공학부 | 5000000 |
| 2 | hongildong2 | 경영학부 | 4000000 |
| 3 | hongildong3 | 기계공학부 | 6000000 |
문제점
- 학생정보 테이블에서 여전히 중복 발생
- 이행적 종속:
STUDENT_ID → DEPARTMENT → fees
목표:
| STUDENT_ID | COURSE_ID | GRADE |
|---|---|---|
| 1 | CSE011101 | A+ |
| 1 | CSE022202 | A |
| 1 | CSE033303 | B+ |
| 2 | MEC011101 | A |
| 3 | POD032939 | C |
| STUDENT_ID | STUDENT_NM | 학부ID |
|---|---|---|
| 1 | hongildong | 1 |
| 2 | hongildong2 | 2 |
| 3 | hongildong3 | 3 |
| 4 | hongildong4 | 1 |
| 5 | hongildong5 | 1 |
| 6 | hongildong6 | 1 |
| ID | DEPARTMENT | fees |
|---|---|---|
| 1 | 컴퓨터공학부 | 5000000 |
| 2 | 경영학부 | 4000000 |
| 3 | 기계공학부 | 6000000 |
완성된 구조의 장점
- 삽입 이상 방지: 새로운 학부 등록 시 학생 없이도 가능
- 삭제 이상 방지: 학생 삭제 시 학부정보 보존
- 갱신 이상 방지: 컴퓨터공학부 등록금 변경 시 한 곳만 수정
| 단계 | 문제 해결 | 분리 기준 | 테이블 수 |
|---|---|---|---|
| 1NF | 다중값 → 원자값 | 행 분리 | 1 → 1 |
| 2NF | 부분 종속 제거 | 학생정보 분리 | 1 → 2 |
| 3NF+BCNF | 이행 종속 제거 결정자 문제 해결 | 학부정보 분리 | 2 → 3 |
결국 핵심은 원자성을 보장 하였는지, 그리고 부분 종속을 제거 하였는지를 파악하면 되고,
부분종속에 대한 개념을 잡기 위해서는 예를들어 학번을 조회하면 학부를 알 수 있는가? 학부를 조회하면 학번을 알수 있는가? 이런식으로 사고해보면 종속관계 파악이 될 듯(근데 그래도 어려움 그냥 표를 다 그려보길 ㅋㅋㅋㅋ)!
역시 기계공학부가 등록금이 비싸네요…
피지컬 ai를 공부하는 저같은 학생은 어떻게 해야하나요?