웹개발/SQL(mySQL)
정규화 - [제 1 정규형 (1NF)]
bergerac
2025. 6. 28. 09:11
제1정규형(1NF)이란?
**제1정규형(1NF, First Normal Form)**은 모든 컬럼이 원자값(Atomic Value)을 가져야 한다는 원칙을 말한다. 즉, 한 셀에는 하나의 값만 들어가야 하며, 반복되는 그룹이나 다중 값이 존재해서는 안 된다.
제1정규형의 핵심 요건:
- 모든 컬럼은 원자값을 가져야 한다.
- 반복 그룹(Repeated Group)이 없어야 한다.
- 모든 행(Row)은 유일해야 한다.
💡 원자값이란?
더 이상 나눌 수 없는, 가장 작은 단위의 데이터
예를 들어, '슬립테크, 코딩테스트, 리눅스'와 같은 문자열은 콤마(,)를 기준으로 여러 개의 값을 포함하므로 원자값이 아님. 이 값은 하나의 셀에 들어가기엔 지나치게 많은 정보를 담고 있다.
제1정규형 위반 예시: 비정규형 테이블
use `normalization`;
create table `제1정규형` (
student_id int,
student_name varchar(50),
course_name varchar(100)
);
-- 비정규형 예시 (1NF 위반)
-- 동일한 필드에 여러 값을 넣은 경우
-- (1, '이승아', '슬립테크, 코딩테스트, 리눅스')
-- (2, '이도경', '챗GPT, DBMS')
위 테이블은 course_name 컬럼에 여러 개의 과목명을 동시에 저장하고 있어서 1NF를 위반한 상태다. 이렇게 구성하면 쿼리하기도 어렵고, 데이터 정합성도 보장받을 수 없다.
✅ 제1정규형 적용 예시: 원자값 분리
위 문제를 해결하기 위해 course_name에 들어있는 다중 값을 각각의 행으로 분리한다. 다음처럼 데이터 구조를 재설계한다:
-- 1NF 적용 테이블
insert into `제1정규형`
values
(1, '고혁재', '슬립테크'),
(1, '고혁재', '코딩테스트'),
(2, '장소정', '슬립테크'),
(2, '장소정', '리눅스'),
(3, '박미진', '슬립테크');
select * from `제1정규형`;
이제 모든 컬럼은 원자값을 포함하며, 테이블 구조는 제1정규형을 만족한다.
🔍 제1정규형의 장점
- 데이터 정합성 보장
: 하나의 셀에 하나의 값만 있으므로, 데이터의 정확성 확보가 쉬움 - 중복 제거 및 관리 용이
: 반복 그룹을 제거하여 데이터를 구조적으로 관리 가능 - 추후 정규화 진행의 기반 마련
: 2NF, 3NF 등 다음 정규화 단계로 나아가기 위한 첫걸음
📉 제1정규형의 단점
- 데이터 분산으로 인한 조인 연산 증가
: 여러 행으로 분리되면서, 관련 데이터를 다시 모으기 위해 JOIN 연산이 필요해짐 - 공간 낭비 가능성
: student_name처럼 반복적으로 저장되는 필드가 많아져서 디스크 공간 낭비 발생 - 조회 시 불편
: 특정 학생이 듣는 모든 수업을 한 번에 출력하려면 GROUP_CONCAT 같은 집계 함수나 복잡한 쿼리 작성이 필요
정리: '하나의 셀에는 하나의 값'
제1정규형은 데이터베이스 정규화의 출발점이다. 복잡한 구조를 단순화하고, 데이터 무결성을 확보하기 위한 기본 설계 원칙이다. 처음에는 다소 불편하게 느껴질 수 있지만, 장기적인 관점에서 보면 데이터베이스의 안정성과 유연성을 확보하는 데 필수적이다.
🚨 Tip!
1NF는 원자성만을 보장할 뿐, 관계형 구조의 이상 현상(삽입/갱신/삭제 이상)을 완전히 해결하지는 못한다.
이를 위해선 다음 단계인 제2정규형(2NF), 제3정규형(3NF), 그리고 BCNF까지 순차적으로 적용할 필요가 있다.