DB를 설계하다 보면 비슷한 종류의 데이터가 여러 테이블에 걸쳐 반복되는 상황을 볼 수 있다.
실제 사례로 보자.
CREATE DATABASE IF NOT EXISTS my_shop4;
USE my_shop4;
실습용 DB를 만든다.

쇼핑몰을 운영한다고 해보자. 주문 테이블에는 주문 상태가 필요하다. 주문 상태를 표현하는 가장 단순한 방법은 상태값을 문자열로 직접 저장하는 것이다.
테이블을 하나 예시로 만든다.
DROP TABLE IF EXISTS orders;
CREATE TABLE orders (
order_id BIGINT PRIMARY KEY AUTO_INCREMENT,
member_id BIGINT NOT NULL,
order_status VARCHAR(20) NOT NULL,
total_amount INT NOT NULL,
created_at DATETIME NOT NULL
);
주문 데이터를 입력해보자.
INSERT INTO orders (member_id, order_status, total_amount, created_at) VALUES
(1, '주문완료', 50000, '2026-01-15 10:30:00'),
(2, '결제완료', 75000, '2026-01-15 11:00:00'),
(3, '배송중', 30000, '2026-01-15 12:00:00'),
(1, '배송완료', 120000, '2026-01-14 09:00:00'),
(4, '주문취소', 45000, '2026-01-13 15:00:00');
조회해보면 이런 데이터가 나온다.

이게 뭐가 문제인걸까?