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)**은 다음 세 가지 기준을 만족해야 한다.
- 1NF를 만족 (모든 컬럼은 원자값이어야 함)
- 복합키가 존재하는 경우, 비기본 속성은 반드시 전체 키에 완전 종속되어야 한다.
- 부분 함수 종속이 발견된다면, 해당 속성을 별도의 테이블로 분리해야 한다.
.
'웹개발 > 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 |