정규화(Normalization)란 무엇이며, 제1 정규형(1NF), 제2 정규형(2NF), 제3 정규형(3NF)은?
관계형 데이터베이스에서 중요하다.
제1정규화 | 제2정규화 | 제3정규화 | |
목표 | 테이블이 원자성을 만족해야 함 (각 칸에 하나의 값만 존재) | 부분 함수 종속 제거 부분 함수 종속: composite primary key일 때 콜럼이 그중 하나의 키에만 종속될 때. |
부분 함수 종속 제거 + 이행적 종속 제거 (기본 키가 아닌 컬럼 간 종속 제거) |
필요한 전제 조건 | 없음 | 제1 정규형(1NF) 만족 | 제2 정규형(2NF) 만족 |
해결 방법 | 각 컬럼을 원자값(Atomic)으로 변환 | 복합키가 있는 테이블에서 일부 키에만 종속된 컬럼을 새로운 테이블로 이동 | 기본 키가 아닌 컬럼 간의 종속성을 분리 |
예제 | 한 개의 셀에 여러 개의 값이 들어가는 경우 분리 | ProductName이 ProductID에만 종속됨 → Products 테이블로 분리 | CategoryName이 CategoryID에 종속됨 → Categories 테이블로 분리 |
제1정규형
전
Orders Table:
+-----------+-----------+----------------+
| OrderID | ProductID | ProductName |
+-----------+-----------+----------------+
| 1 | 101 | Laptop, Chair |
| 2 | 102 | Phone |
+-----------+-----------+----------------+
후
Orders Table:
+-----------+-----------+----------------+
| OrderID | ProductID | ProductName |
+-----------+-----------+----------------+
| 1 | 101 | Laptop |
| 2 | 102 | Phone |
| 3 | 103 | Chair |
+-----------+-----------+----------------+
제2정규형:
전
부분함수 종속성이 있는 학생 성적 테이블(StudentScores)
학생ID (StudentID) | 과목 (Subject) | 점수 (Score) | 학생 이름 (StudentName) |
101 | 수학 | 90 | 김철수 |
101 | 영어 | 85 | 김철수 |
102 | 국어 | 88 | 이영희 |
103 | 수학 | 95 | 박민준 |
이 테이블에서 기본키(Primary Key)는 StudentID, Subject의 조합이다.
즉, 한 학생(StudentID)이 여러 과목(Subject)의 성적을 가질 수 있기 때문에, 각 행을 고유하게 구분하기 위해 두 개의 컬럼이 기본키가 된다.
- Score(점수)는 (StudentID, Subject) 두 개의 키를 모두 알아야 결정됨 → 부분 함수 종속 아님
- StudentName(학생 이름)은 StudentID에 의해서만 결정됨. 즉, StudentName은 Subject와는 관계없이 StudentID에만 종속됨. 하지만 기본키는 (StudentID, Subject) 이므로 부분 함수 종속이 발생함
후(부분함수종속 제거를 위한 테이블 분리)
(1) 학생 정보 테이블 (Students)
학생ID (StudentID) | 학생 이름 (StudentName) |
101 | 김철수 |
102 | 이영희 |
103 | 박민준 |
(2) 성적 테이블 (Scores)
각 학생의 과목별 점수 정보만을 저장한다.
학생ID (StudentID) | 과목 (Subject) | 점수 (Score) |
101 | 수학 | 90 |
101 | 영어 | 85 |
102 | 국어 | 88 |
103 | 수학 | 95 |
제3 정규형
제3정규형(3NF)은 제2정규형(2NF)을 만족하면서, 이행적 종속(Transitive Dependency)이 없는 상태를 의미한다.
전
(1) Scores 테이블
학생ID (StudentID) | 과목 (Subject) | 점수 (Score) | 학과 (Department) |
101 | 수학 | 90 | 컴퓨터공학과 |
101 | 영어 | 85 | 컴퓨터공학과 |
102 | 국어 | 88 | 경영학과 |
103 | 수학 | 95 | 기계공학과 |
(2) Students 테이블
학생ID (StudentID) | 학생 이름 (StudentName) |
101 | 김철수 |
102 | 이영희 |
103 | 박민준 |
문제점: 이행적 종속 발생
- StudentID → 학과(Department) (학생 ID가 학과를 결정함 ✅)
- StudentID → 과목(Subject), 점수(Score) (학생 ID와 과목이 점수를 결정함 ✅)
- 하지만 학과(Department)는 StudentID에 의해 결정되므로, 과목(Subject)과 점수(Score)와는 직접적인 관계가 없다!
- 즉, StudentID → Department 이고,
- Department이 다른 속성과는 관계가 없으므로 이행적 종속이 발생한다.
후
이행적 종속을 없애기 위해 학과(Department) 정보를 별도의 테이블로 분리한다
학생ID (StudentID) | 학생 이름 (StudentName) | 학과ID (DepartmentID) |
101 | 김철수 | 1 |
102 | 이영희 | 2 |
103 | 박민준 | 3 |
(2) Departments 테이블 (학과 정보 테이블)
학과ID (DepartmentID) | 학과명 (DepartmentName) |
1 | 컴퓨터공학과 |
2 | 경영학과 |
3 | 기계공학과 |
(3) Scores 테이블 (학생 성적 테이블)
학생ID (StudentID) | 과목 (Subject) | 점수 (Score) |
101 | 수학 | 90 |
101 | 영어 | 85 |
102 | 국어 | 88 |
103 | 수학 | 95 |
데이터베이스 인덱스(Database Index)의 역할과 사용 방법에 대해 설명해 주세요.
'면접 준비' 카테고리의 다른 글
CS공부 ) 컴퓨터 아키텍처 (0) | 2025.03.25 |
---|---|
CS공부 ) 컴파일러 (0) | 2025.03.25 |
CS공부 ) 네트워크 (0) | 2025.03.25 |
CS공부 ) 운영체제 (0) | 2025.03.24 |
CS공부 ) 데이터베이스 (0) | 2025.03.24 |