제3정규화란?
**제3정규형(3NF: Third Normal Form)**은 다음 조건을 만족하는 상태를 말한다:
- 제2정규형(2NF)을 만족해야 하며,
- 모든 비기본 속성이 기본키에만 종속되어야 한다.
- 즉, 이행적 종속성(Transitive Dependency)을 제거해야 한다.
이행적 종속성이란?
이행적 종속성은 말 그대로 종속이 중첩된 경우를 말한다.
간단히 표현하면 다음과 같은 구조다:
A → B
B → C
⇒ A → C (이행적 종속)
즉, A로 B를 결정할 수 있고, B로 C를 결정할 수 있다면 A로 C도 결정되지만,
A와 C는 직접적인 관계가 없는데도 연결된 것처럼 보이는 불안정한 상태라는 것이다.
실전 예제: 이행적 종속 제거
다음은 이행적 종속성이 존재하는 데이터 구조의 예다.
학번 | 이름 | 학과ID | 학과명 | 학과위치
--------------------------------------------
1 | 최낙원 | 101 | 컴공 | 부산
분석
- 기본키(PK): 학번
- 비기본 속성: 이름, 학과ID, 학과명, 학과위치
종속성 흐름
- 학번 → 학과ID (학생이 소속한 학과)
- 학과ID → 학과명, 학과위치 (학과 정보)
따라서 다음과 같은 이행적 종속이 존재한다:
학번 → 학과ID → 학과명, 학과위치
즉, 학번은 직접적으로 학과명과 학과위치를 결정하지 않지만, 중간에 있는 학과ID를 통해 간접적으로 영향을 주고 있다.
제3정규화 적용: 이행적 종속 분리하기
이제 위 테이블을 두 개로 나눠보자.
학생 정보와 학과 정보를 분리해서 관리한다.
-- 학과 정보 테이블
CREATE TABLE departments_3 (
department_id INT PRIMARY KEY,
department_name VARCHAR(100),
location VARCHAR(100)
);
-- 학생 정보 테이블
CREATE TABLE students_3 (
student_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments_3(department_id)
);
데이터 입력 예시
INSERT INTO departments_3 VALUES
(101, '컴공', '서울'),
(102, '전자공학', '부산');
INSERT INTO students_3 VALUES
(1, '임재혁', 101),
(2, '오선우', 102),
(3, '이준우', 102);
조인으로 데이터 다시 연결
정규화를 적용했다고 해서 데이터를 보기 어렵게 만든 건 아니다.
필요하면 JOIN을 통해 얼마든지 데이터를 다시 합칠 수 있다.
SELECT
S.student_id,
S.name,
D.department_name,
D.location
FROM
students_3 S
JOIN
departments_3 D
ON
S.department_id = D.department_id;
위 쿼리는 다음과 같이 결과를 출력할 것이다.
student_id | name | department_name | location
-----------------------------------------------
1 | 임재혁 | 컴공 | 서울
2 | 오선우 | 전자공학 | 부산
3 | 이준우 | 전자공학 | 부산
왜 제3정규화가 중요한가?
1. 데이터 중복 최소화
- 한 학과에 속한 여러 학생이 있을 경우, 학과명과 위치가 반복된다면 이는 낭비다.
- 별도 테이블로 분리하면 한 번만 저장하면 된다.
2. 수정 이상(Anomaly) 방지
- 만약 컴퓨터공학 학과의 위치가 ‘서울’에서 ‘대전’으로 변경된다면?
- 비정규형에서는 관련 학생들 모든 행을 수정해야 함
- 3NF에서는 departments_3 테이블의 한 행만 수정하면 됨
3. 삭제 이상 방지
- 학생 한 명이 퇴학해 학생 테이블에서 삭제되었을 때,
- 학과 정보도 같이 사라지면 안 됨 (데이터 손실)
- 학과 테이블이 별도로 존재하면 이런 문제도 예방 가능
이행적 종속이 항상 나쁜 걸까?
꼭 그렇지만은 않다.
정규화 vs 성능의 균형은 실무에서 자주 등장하는 고민이다.
- 읽기 성능이 중요할 땐 일부러 이행적 종속을 유지한 형태로 역정규화를 하기도 함
- 그러나 그럴 땐 반드시 이유가 있어야 하고, 초기 설계 단계에서는 정규화를 우선하는 것이 안전하다
마무리
제3정규형은 **“모든 비기본 속성은 오직 기본키에만 종속되어야 한다”**는 명제를 기반으로 한다.
이행적 종속을 제거함으로써 데이터 중복과 이상 현상을 방지하고,
유지보수와 확장에 유리한 구조를 만들 수 있다.
다음 글에서는 BCNF(Boyce-Codd Normal Form)으로 넘어가
제3정규형의 한계를 보완하는 고급 정규화 개념을 다룰 예정이다.
'웹개발 > SQL(mySQL)' 카테고리의 다른 글
| 정규화 - [제 2 정규형(2NF)] (0) | 2025.06.29 |
|---|---|
| 정규화 - [제 1 정규형 (1NF)] (1) | 2025.06.28 |
| 정규화 (2) | 2025.06.27 |
| ERD Diagram (0) | 2025.06.26 |
| Trigger - 자동화 (0) | 2025.06.25 |