disaster_orders 테이블에서 product_infos 컬럼을 다시 보자.
'10:노트북:2:1500000,15:키보드:1:50000'
하나의 컬럼 안에 여러 상품 정보가 쉼표(,)로 구분되어 들어 있고, 각 상품의 상세 정보는 : 로 다시 나뉘어 있다. 이런 구조는 다음과 같은 심각한 문제를 만든다.
product_infos 문자열을 애플리케이션에서 파싱한 다음 검색해야 한다.WHERE 조건을 활용하기도 어렵다.이런 문제를 해결하기 위한 첫 단계가 바로 제1 정규형(1NF) 이다.
제1 정규형(1NF)
테이블의 모든 컬럼이 원자적(Atomic) 인 값만을 가져야 한다.
여기서 "원자적"이라는 것은 더 이상 쪼갤 수 없는 값이라는 뜻이다.
product_infos 컬럼은 내부적으로 상품 ID, 상품명, 수량, 가격 등 여러 정보를 담고 있으므로 원자적이지 않다.제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;