본문 바로가기
면접 준비

CS공부 ) 데이터베이스 설계

by jennyiscoding 2025. 3. 25.

정규화(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