티스토리 뷰
반응형
2026.05.13 - [데이터베이스] - 데이터베이스 제1정규화
2026.05.13 - [데이터베이스] - 데이터베이스 제2정규화
데이터베이스 설계의 완성도를 높이는 제3정규화(Third Normal Form, 3NF)에 대해 정리해 드립니다. 제3정규화는 데이터 간의 '연쇄적인 의존 관계'를 끊어내어 데이터 무결성을 최종적으로 확보하는 단계입니다.
1. 제3정규화(3NF)의 정의와 성립 조건
정의
제3정규화란 "제2정규형을 만족하면서, 기본키(PK)가 아닌 모든 속성 간에 '이행적 함수 종속(Transitive Functional Dependency)'이 없어야 한다"는 원칙입니다. 쉽게 말해, 기본키가 아닌 일반 컬럼들끼리 서로 종속 관계를 가지면 안 된다는 뜻입니다.
- 성립 조건 1: 테이블이 제2정규형(2NF)을 만족해야 합니다.
- 성립 조건 2 (비이행성): 기본키(A)를 통해 속성(B)를 알고, 그 속성(B)를 통해 또 다른 속성(C)을 알 수 있는 관계($A \to B \to C$)가 존재해서는 안 됩니다.
- E.F. Codd의 정의 (1971): "Every non-prime attribute of R is non-transitively dependent on every key of R." (R의 모든 비주요 속성이 R의 모든 키에 대해 이행적으로 종속되지 않아야 한다.)
2. 핵심 개념: 이행적 함수 종속 (Transitive Dependency)
이행적 종속이란 논리학의 삼단논법과 비슷합니다.
[이행적 종속의 예시]
- 학번(A)을 알면 학과(B)를 알 수 있다. ($A \to B$)
- 학과(B)를 알면 학과 사무실 위치(C)를 알 수 있다. ($B \to C$)
- 결과적으로 학번(A)을 통해 학과 사무실 위치(C)를 알 수 있게 된다. ($A \to C$)
이 경우, 학과 사무실 위치(C)는 기본키인 학번에 직접 종속된 것이 아니라 학과(B)를 거쳐 이행적으로 종속된 것이며, 이는 제3정규화 위반 대상입니다.
3. 제3정규화 미적용 시 발생하는 이상 현상
| 이상 현상 | 내용 |
| 삽입 이상 | 새로운 학과와 그 학과 사무실 위치를 등록하고 싶어도, 해당 학과에 소속된 학생(학번)이 없으면 등록이 불가능함. |
| 삭제 이상 | 특정 학생의 데이터를 삭제할 때, 그 학생이 속한 학과의 사무실 위치 정보까지 함께 사라짐. |
| 갱신 이상 | 학과 사무실이 이사했을 경우, 해당 학과 소속 모든 학생의 행을 수정해야 하며, 누락 시 데이터 불일치가 발생함. |
반응형
4. 실전 예제: 학생 정보 테이블 분석
[Step 1] 제2정규화 완료 상태
기본키는 학번입니다. 모든 일반 속성은 학번에 완전 종속되어 있습니다.
| 학번 (PK) | 이름 | 학과 | 학과 사무실 번호 |
| 1001 | 홍길동 | 컴퓨터공학 | 02-123-4567 |
| 1002 | 임꺽정 | 전자공학 | 02-987-6543 |
| 1003 | 장길산 | 컴퓨터공학 | 02-123-4567 |
- 분석:
- 학번 $\to$ 학과 (결정됨)
- 학과 $\to$ 학과 사무실 번호 (결정됨)
- 학번 $\to$ 학과 $\to$ 학과 사무실 번호 구조이므로 이행적 종속 발생.
[Step 2] 제3정규화 적용 (테이블 분리)
이행적 관계를 형성하는 학과와 학과 사무실 번호를 별도 테이블로 분리합니다.
1. 학생 테이블
| 학번 (PK) | 이름 | 학과 (FK) |
| 1001 | 홍길동 | 컴퓨터공학 |
| 1002 | 임꺽정 | 전자공학 |
| 1003 | 장길산 | 컴퓨터공학 |
2. 학과 정보 테이블
| 학과 (PK) | 학과 사무실 번호 |
| 컴퓨터공학 | 02-123-4567 |
| 전자공학 | 02-987-6543 |
5. SQL 구현 예제
SQL
-- 1. 학과 정보를 담는 부모 테이블
CREATE TABLE Departments (
DeptName VARCHAR(50) PRIMARY KEY,
OfficePhone VARCHAR(20)
);
-- 2. 학생 정보를 담는 자식 테이블 (3NF 준수)
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName VARCHAR(50),
DeptName VARCHAR(50),
CONSTRAINT FK_Dept FOREIGN KEY (DeptName) REFERENCES Departments(DeptName)
);
-- 데이터 삽입
INSERT INTO Departments VALUES ('컴퓨터공학', '02-123-4567');
INSERT INTO Students VALUES (1001, '홍길동', '컴퓨터공학');
6. 요약 및 핵심 체크리스트
| 항목 | 내용 |
| 핵심 목적 | 일반 속성 간의 종속성 제거 (이행적 종속 제거) |
| 판단 기준 | "기본키가 아닌 컬럼 A를 알면 컬럼 B를 알 수 있는가?" |
| 해결 방법 | 결정자(Determinant)와 종속자(Dependent)를 별도 테이블로 분리 |
| 기대 효과 | 데이터 저장 공간 절약 및 논리적 일관성 확보 |
#데이터베이스 #제3정규화 #3NF #정규화 #Normalization #이행적함수종속 #DB설계 #데이터모델링 #SQL #RDBMS #데이터무결성 #백엔드개발 #기술면접대비 #정보처리기사 #DB튜닝 #소프트웨어아키텍처 #개발자학습 #데이터베이스기초
'데이터베이스' 카테고리의 다른 글
| DB 인덱스(Index) 원리부터 B-Tree 구조, 복합 인덱스 설정 기준 완벽 정리 (0) | 2026.06.05 |
|---|---|
| JPA N+1 문제 원인 및 해결 방법: Fetch Join과 Batch Size 완벽 정리 (0) | 2026.06.04 |
| SQL JOIN 종류 및 예제 (0) | 2026.05.24 |
| 데이터베이스 정규화 BCNF (0) | 2026.05.17 |
| 데이터베이스 제2정규화 (0) | 2026.05.17 |
| 데이터베이스 제1정규화 (0) | 2026.05.17 |
| 가장 많이 사용된 데이터베이스(DBMS) TOP10 - 2026 최신버전 (0) | 2026.05.07 |
| 오라클 SPLIT 구분자로 자르기 함수 구현 (1) | 2020.05.13 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자바
- 데이터베이스
- C언어
- 배열
- 상속
- 파일처리
- C++ 클래스
- 클래스
- Java
- 벡터
- Android
- html
- String
- MySQL
- 블루투스
- 문자열
- 아두이노
- C
- 리스트
- Class
- 자료구조
- 문제풀이
- 파이썬
- 정보처리기사
- DB연동
- OpenCV
- 알고리즘
- c#
- 안드로이드
- C++
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
반응형