웹개발/SQL(mySQL)

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

bergerac 2025. 6. 29. 09:11

1. 제2정규화란?

**제2정규화(2NF, Second Normal Form)**는 정규화의 두 번째 단계다. 이 단계는 **제1정규화(1NF)**를 만족한 상태에서 출발하여, 다음 조건을 만족해야 한다.

  • 모든 비기본 속성이 기본키에 완전 함수 종속되어야 한다.

여기서 용어 정리부터!

  • 기본키(Primary Key): 테이블에서 각 행(row)을 유일하게 식별할 수 있는 열(Column)
  • 비기본 속성: 기본키가 아닌 나머지 일반 컬럼들
  • 완전 함수적 종속: 비기본 속성이 기본키 전체에 의존하는 것
    → 기본키 일부만으로는 값을 알 수 없고, 전체 조합이 필요
  • 부분 함수적 종속: 기본키의 일부에만 비기본 속성이 종속된 상태
    → 제2정규형을 위반하는 경우

2. 제2정규화가 왜 중요한가?

복합 기본키를 가진 테이블에서, 어떤 비기본 속성이 그 중 일부 키만으로 결정된다면 이는 부분 종속이다. 이럴 경우 중복이 발생하거나, 테이블을 수정하거나 삭제할 때 데이터 무결성이 깨질 수 있다.

예를 들어, 직원(employee)이 어떤 부서(department)에 소속되어 있고, 부서 위치(location)는 오직 부서명으로 결정된다면? 부서명만 알고 있어도 위치를 유추할 수 있다면 location은 employee_id에 의존하지 않게 된다.
→ 이건 명백한 부분 함수 종속이며, 2NF 위반이다.


3. 제2정규형 만족 예시

먼저 2NF를 정상적으로 만족하는 예제를 보자.

-- 부서 테이블
CREATE TABLE departments (
	department_id VARCHAR(50) PRIMARY KEY,
    location VARCHAR(50),
    supervisor_id VARCHAR(50)
);

-- 직원 테이블
CREATE TABLE employees (
	employee_id VARCHAR(10) PRIMARY KEY,
    department_id VARCHAR(50),
    FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

-- 데이터 삽입
INSERT INTO departments VALUES
	('HR', 'seoul', 's1'),
	('SALES', 'busan', 's2');

INSERT INTO employees VALUES
	('e1', 'SALES'),
	('e2', 'HR'),
	('e3', 'SALES'),
	('e4', 'HR');
  • departments: 기본키 department_id에 종속된 location, supervisor_id는 문제 없음 → 2NF 만족
  • employees: 기본키 employee_id는 단일 키 → 부분 종속 개념 자체가 없음 → 2NF 만족

4. 제2정규형 위반 사례

이제 2NF를 위반한 테이블 구조를 보자. 이번에는 기본키가 **복합키(employee_id, department)**인 경우다.

CREATE TABLE wrong_2nf (
	employee_id VARCHAR(10),
    department VARCHAR(50),
    location VARCHAR(50),
    PRIMARY KEY (employee_id, department)
);
  • location은 department만으로 결정된다.
  • 그런데 현재 테이블에서는 (employee_id, department)라는 복합키 전체에 종속되어야만 2NF 조건을 만족한다.
  • 하지만 location은 오직 department만 알면 충분하다.
    → employee_id는 관계가 없음 → 부분 함수 종속 발생!

결과적으로 location은 기본키 일부인 department에만 의존 → 2NF 위반


5. 해결 방법: 테이블 분리

2NF 위반은 부분 함수적 종속을 분리함으로써 해결할 수 있다. 아래와 같이 location 컬럼은 departments 테이블로 옮기고, employees 테이블에는 부서만 남긴다.

-- 올바른 설계
CREATE TABLE departments (
	department VARCHAR(50) PRIMARY KEY,
    location VARCHAR(50)
);

CREATE TABLE employees (
	employee_id VARCHAR(10) PRIMARY KEY,
    department VARCHAR(50),
    FOREIGN KEY (department) REFERENCES departments(department)
);

비기본 속성(location)은 이제 완전히 department 키에 종속된다.
employees 테이블에서는 employee_id가 기본키이므로 문제 없음.


6. 정리: 제2정규화의 핵심 요약

**제2정규형(2NF)**은 다음 세 가지 기준을 만족해야 한다.

  1. 1NF를 만족 (모든 컬럼은 원자값이어야 함)
  2. 복합키가 존재하는 경우, 비기본 속성은 반드시 전체 키에 완전 종속되어야 한다.
  3. 부분 함수 종속이 발견된다면, 해당 속성을 별도의 테이블로 분리해야 한다.

.

'웹개발 > SQL(mySQL)' 카테고리의 다른 글

정규화 - [제 3 정규형(3NF)]  (0) 2025.06.30
정규화 - [제 1 정규형 (1NF)]  (1) 2025.06.28
정규화  (2) 2025.06.27
ERD Diagram  (0) 2025.06.26
Trigger - 자동화  (0) 2025.06.25