2정규형 주문 분리

2NF는 복합키 일부에 기대는 주문 속성을 분리한다

주문 원장의 후보키가 {주문ID, 상품ID}라면, 주문ID만으로 정해지는 속성과 상품ID만으로 정해지는 속성은 주문항목에 남기면 안 된다. 둘이 함께 정하는 수량과 주문단가만 주문항목에 남긴다.

주문ID

고객ID, 주문일

상품ID

상품명, 현재정가

주문ID + 상품ID

수량, 주문단가

주문ID 고객ID, 주문일을 결정한다.
상품ID 상품명, 현재정가를 결정한다.
복합키 수량과 주문단가는 주문 항목 사실이다.
원장 서로 다른 사실이 한 행에 반복되어 갱신 이상을 만든다.
orders 주문ID PK 고객ID, 주문일
products 상품ID PK 상품명, 현재정가
order_items 주문ID + 상품ID PK 수량, 주문단가
분리 기준 복합키 일부만으로 정해지는 속성은 별도 테이블로 이동한다.
중심 테이블 주문항목은 두 FK가 함께 만들어내는 거래 사실만 보관한다.
효과 상품명 변경, 주문일 수정, 항목 추가가 서로 덜 흔들린다.
주문ID만 결정 orders 고객ID, 주문일은 주문 테이블로 이동한다.
상품ID만 결정 products 상품명, 현재정가는 상품 테이블에서 한 번만 관리한다.
두 키가 함께 결정 order_items 수량, 주문단가는 주문과 상품의 조합 사실로 남긴다.

분리 전 주문 원장

한 행에 주문 사실, 상품 사실, 주문항목 사실이 섞여 있다.

order_ledger 부분 함수 종속
주문 사실
상품 사실
항목 사실
주문O100 고객C01 일자2026-05-01
상품P10 이름키보드 정가9000
수량2 단가9000
주문O100 고객C01 일자2026-05-01
상품P20 이름마우스 정가15000
수량1 단가15000
주문O101 고객C02 일자2026-05-02
상품P10 이름키보드 정가9000
수량1 단가9000
주문 테이블로 이동
주문ID 고객ID · 주문일

O100의 고객과 주문일은 상품이 몇 개든 같은 값으로 반복된다.

상품 테이블로 이동
상품ID 상품명 · 현재정가

P10의 상품 정보는 어떤 주문에 들어가도 같은 상품의 사실이다.

주문항목에 유지
주문ID + 상품ID 수량 · 주문단가

수량과 주문 당시 단가는 주문과 상품 조합이 있어야 결정된다.

2NF 분리 결과

복합키 일부에만 기대는 속성을 따로 빼서 반복과 갱신 위험을 줄인다.

orders PK 주문ID
주문ID 고객ID 주문일
O100 C01 2026-05-01
O101 C02 2026-05-02
products PK 상품ID
상품ID 상품명 현재정가
P10 키보드 9000
P20 마우스 15000
order_items 복합 FK
주문ID 상품ID 수량 주문단가
O100 P10 2 9000
O100 P20 1 15000
O101 P10 1 9000
주문 변경은 한 곳

O100의 주문일 수정은 orders 한 행에서 끝난다.

상품 변경도 한 곳

상품명과 현재정가는 products가 관리하므로 항목마다 반복 수정하지 않는다.

항목 의미는 보존

주문단가는 현재정가가 아니라 주문 당시 가격 스냅샷으로 남긴다.