티스토리 뷰
반응형
2026.05.13 - [데이터베이스] - 데이터베이스 제1정규화
데이터베이스 설계에서 제2정규화(Second Normal Form, 2NF)는 데이터 중복을 줄이고 무결성을 높이는 매우 중요한 단계입니다. 특히 복합키(Composite Key)를 사용하는 구조에서 발생하는 부분적 종속성을 해결하는 핵심 과정을 상세히 정리해 드립니다.
1. 제2정규화(2NF)의 정의와 성립 조건
정의
제2정규화란 "제1정규형을 만족하면서, 기본키(Primary Key)가 아닌 모든 속성이 기본키에 '완전 함수적 종속' 상태여야 한다"는 원칙입니다. 즉, 기본키의 일부분에만 의존하는 속성이 있어서는 안 된다는 뜻입니다.
- 성립 조건 1: 테이블이 이미 제1정규형(1NF)을 만족해야 합니다.
- 성립 조건 2 (완전 함수적 종속): 기본키가 여러 컬럼으로 구성된 복합키(Composite Key)일 때, 일반 컬럼은 복합키 전체에 의존해야지, 그중 하나의 컬럼에만 의존해서는 안 됩니다.
- E.F. Codd의 이론: 1971년 제1정규형의 이상 현상을 해결하기 위해 발표되었으며, 주로 '부분 함수적 종속성(Partial Functional Dependency)' 제거에 초점을 맞춥니다.
2. 핵심 개념: 완전 함수적 종속 vs 부분 함수적 종속
| 개념 | 설명 |
| 함수적 종속 (FD) | X의 값을 알면 Y의 값을 유일하게 결정할 수 있을 때, Y는 X에 함수적으로 종속된다고 함 ($X \to Y$) |
| 완전 함수적 종속 | 기본키 전체가 있어야만 속성 값을 결정할 수 있는 경우 |
| 부분 함수적 종속 | 기본키가 복합키일 때, 키의 일부(일부 컬럼)만으로도 특정 속성을 결정할 수 있는 경우 (2NF 위반 대상) |
3. 제2정규화 미적용 시 발생하는 이상 현상 (Anomaly)
기본키가 (학번, 과목코드)인 테이블에 강의실 정보가 포함되어 있고, 강의실이 과목코드에만 종속되어 있다면 다음과 같은 문제가 발생합니다.
- 삽입 이상: 학생이 수강 신청을 하지 않으면 특정 과목의 강의실 정보를 입력할 수 없음.
- 삭제 이상: 특정 학생의 수강 취소 시, 그 과목의 유일한 정보(강의실 위치)까지 함께 삭제됨.
- 갱신 이상: 특정 과목의 강의실이 변경될 때, 해당 과목을 듣는 모든 학생의 행을 수정해야 함 (데이터 불일치 위험).
반응형
4. 실전 예제: 수강 등록 테이블 분석
[Step 1] 제1정규화 완료 상태 (비정규화)
이 테이블의 기본키는 (학번, 과목코드)입니다.
| 학번 (PK) | 과목코드 (PK) | 성적 | 강의실 |
| 202601 | CS101 | A | 공학관 101호 |
| 202601 | CS102 | B | IT센터 205호 |
| 202602 | CS101 | A+ | 공학관 101호 |
- 분석:
- 성적: 특정 학생이 특정 과목을 들었을 때 나오므로 (학번, 과목코드) 전체에 종속됨 (완전 종속 - OK)
- 강의실: 학생과 상관없이 과목코드만 알면 결정됨 (부분 종속 - 2NF 위반)
[Step 2] 제2정규화 적용 (테이블 분리)
부분 함수적 종속성을 가진 강의실 속성을 별도의 테이블로 분리합니다.
1. 수강성적 테이블
| 학번 (PK) | 과목코드 (PK) | 성적 |
| 202601 | CS101 | A |
| 202601 | CS102 | B |
| 202602 | CS101 | A+ |
2. 과목정보 테이블
| 과목코드 (PK) | 강의실 |
| CS101 | 공학관 101호 |
| CS102 | IT센터 205호 |
5. SQL 구현 예제
제2정규화를 준수하여 테이블을 설계하는 표준 DDL입니다.
SQL
-- 1. 과목 마스터 테이블 (과목에 대한 독립적 정보 관리)
CREATE TABLE Subjects (
SubjectCode VARCHAR(10) PRIMARY KEY,
RoomName VARCHAR(50)
);
-- 2. 학생 마스터 테이블
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName VARCHAR(50)
);
-- 3. 수강 내역 테이블 (2NF 준수: 성적은 학번과 과목코드 조합에 의존)
CREATE TABLE Enrollments (
StudentID INT,
SubjectCode VARCHAR(10),
Grade VARCHAR(2),
PRIMARY KEY (StudentID, SubjectCode),
FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
FOREIGN KEY (SubjectCode) REFERENCES Subjects(SubjectCode)
);
6. 제2정규화 요약 및 체크리스트
| 항목 | 내용 |
| 대상 | 기본키가 2개 이상의 컬럼으로 구성된 복합키 테이블 |
| 핵심 작업 | 기본키의 일부분에만 의존하는 속성을 찾아내어 별도 테이블로 분리 |
| 판단 기준 | "기본키 중 하나를 가려도 이 속성값을 알 수 있는가?" → Yes라면 분리 대상 |
| 장점 | 데이터 중복 감소, 삽입/삭제/갱신 이상 현상 방지 |
#데이터베이스 #제2정규화 #2NF #정규화 #Normalization #DB설계 #데이터모델링 #SQL #RDBMS #함수적종속 #백엔드개발 #기술면접 #정보처리기사 #데이터무결성 #복합키 #소프트웨어공학 #클린코드 #DB기초 #프로그래밍학습
'데이터베이스' 카테고리의 다른 글
| JPA N+1 문제 원인 및 해결 방법: Fetch Join과 Batch Size 완벽 정리 (0) | 2026.06.04 |
|---|---|
| SQL JOIN 종류 및 예제 (0) | 2026.05.24 |
| 데이터베이스 정규화 BCNF (0) | 2026.05.17 |
| 데이터베이스 제3정규화 (0) | 2026.05.17 |
| 데이터베이스 제1정규화 (0) | 2026.05.17 |
| 가장 많이 사용된 데이터베이스(DBMS) TOP10 - 2026 최신버전 (0) | 2026.05.07 |
| 오라클 SPLIT 구분자로 자르기 함수 구현 (1) | 2020.05.13 |
| SELECT, ORDER BY 사용법 (3) | 2018.09.28 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Java
- C++ 클래스
- html
- Class
- 문자열
- 정보처리기사
- 아두이노
- C++
- 데이터베이스
- 자바
- 배열
- 문제풀이
- 클래스
- 알고리즘
- 파이썬
- 상속
- Android
- 파일처리
- 자료구조
- MySQL
- 리스트
- c#
- C
- DB연동
- OpenCV
- 블루투스
- 벡터
- 안드로이드
- C언어
- String
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
반응형