웹개발/SQL(mySQL)

정규화 - [제 3 정규형(3NF)]

bergerac 2025. 6. 30. 09:11

 

제3정규화란?

**제3정규형(3NF: Third Normal Form)**은 다음 조건을 만족하는 상태를 말한다:

  1. 제2정규형(2NF)을 만족해야 하며,
  2. 모든 비기본 속성이 기본키에만 종속되어야 한다.
  3. 즉, 이행적 종속성(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