2. 제1 정규형 – 컬럼은 원자값만 가진다

2-1. 왜 제1 정규형이 필요한가

disaster_orders 테이블에서 product_infos 컬럼을 다시 보자.

'10:노트북:2:1500000,15:키보드:1:50000'

하나의 컬럼 안에 여러 상품 정보가 쉼표(,)로 구분되어 들어 있고, 각 상품의 상세 정보는 : 로 다시 나뉘어 있다. 이런 구조는 다음과 같은 심각한 문제를 만든다.

  1. 데이터 검색이 매우 어렵다
  2. 데이터 수정이 복잡하다
  3. 데이터 타입을 제대로 활용할 수 없다

이런 문제를 해결하기 위한 첫 단계가 바로 제1 정규형(1NF) 이다.


2-2. 제1 정규형 정의

제1 정규형(1NF)

테이블의 모든 컬럼이 원자적(Atomic) 인 값만을 가져야 한다.

여기서 "원자적"이라는 것은 더 이상 쪼갤 수 없는 값이라는 뜻이다.

제1 정규형을 만족시키기 위해서는 반복되는 상품 정보를 별도의 행으로 분리해야 한다.


2-3. 제1 정규형을 위반하는 테이블 예제

먼저, 제1 정규형을 위반하는 테이블을 실제로 만들어 보자.

DROP TABLE IF EXISTS orders_1nf_violating;

-- 제1 정규형을 위반하는 테이블
CREATE TABLE orders_1nf_violating (
  order_id     INT NOT NULL,
  ordered_at   DATETIME NOT NULL,
  member_id    INT NOT NULL,
  member_name  VARCHAR(50) NOT NULL,
  product_infos VARCHAR(255) NOT NULL -- 이 컬럼이 원자성을 위반한다.
);

-- 데이터 삽입
INSERT INTO orders_1nf_violating (order_id, ordered_at, member_id, member_name, product_infos) VALUES
(1001, '2025-08-20 10:00:00', 1, '션', '10:노트북:2:1500000,15:키보드:1:50000'),
(1002, '2025-08-21 11:00:00', 2, '네이트', '10:노트북:1:1500000'),
(1003, '2025-08-21 12:00:00', 1, '션', '20:마우스:1:30000');

-- 확인
SELECT * FROM orders_1nf_violating;