웹개발/SQL(mySQL)

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

bergerac 2025. 6. 28. 09:11

제1정규형(1NF)이란?

**제1정규형(1NF, First Normal Form)**은 모든 컬럼이 원자값(Atomic Value)을 가져야 한다는 원칙을 말한다. 즉, 한 셀에는 하나의 값만 들어가야 하며, 반복되는 그룹이나 다중 값이 존재해서는 안 된다.

제1정규형의 핵심 요건:

    1. 모든 컬럼은 원자값을 가져야 한다.
    2. 반복 그룹(Repeated Group)이 없어야 한다.
    3. 모든 행(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정규형의 장점

  1. 데이터 정합성 보장
    : 하나의 셀에 하나의 값만 있으므로, 데이터의 정확성 확보가 쉬움
  2. 중복 제거 및 관리 용이
    : 반복 그룹을 제거하여 데이터를 구조적으로 관리 가능
  3. 추후 정규화 진행의 기반 마련
    : 2NF, 3NF 등 다음 정규화 단계로 나아가기 위한 첫걸음

📉 제1정규형의 단점

  1. 데이터 분산으로 인한 조인 연산 증가
    : 여러 행으로 분리되면서, 관련 데이터를 다시 모으기 위해 JOIN 연산이 필요해짐
  2. 공간 낭비 가능성
    : student_name처럼 반복적으로 저장되는 필드가 많아져서 디스크 공간 낭비 발생
  3. 조회 시 불편
    : 특정 학생이 듣는 모든 수업을 한 번에 출력하려면 GROUP_CONCAT 같은 집계 함수나 복잡한 쿼리 작성이 필요

정리: '하나의 셀에는 하나의 값'

제1정규형은 데이터베이스 정규화의 출발점이다. 복잡한 구조를 단순화하고, 데이터 무결성을 확보하기 위한 기본 설계 원칙이다. 처음에는 다소 불편하게 느껴질 수 있지만, 장기적인 관점에서 보면 데이터베이스의 안정성과 유연성을 확보하는 데 필수적이다.

🚨 Tip!
1NF는 원자성만을 보장할 뿐, 관계형 구조의 이상 현상(삽입/갱신/삭제 이상)을 완전히 해결하지는 못한다.
이를 위해선 다음 단계인 제2정규형(2NF), 제3정규형(3NF), 그리고 BCNF까지 순차적으로 적용할 필요가 있다.