이 스키마는 기준 정보와 거래 이력을 분리해서, 한 주문의 상태와 상품별 내역을 동시에 일관되게 보존합니다.

핵심은 orders 에 공통 정보를 한 번만 저장하고, order_items 에 상품별 반복 정보를 여러 행으로 저장하는 구조입니다.

구조

회원과 상품은 기준 데이터, 주문과 주문상세는 거래 기록입니다

그래서 주문 1건은 헤더 1행과 상세 여러 행으로 나뉘어 저장됩니다.

users 누가 주문했는지 보관하는 회원 기준 정보
products 무엇을 파는지 보관하는 상품 기준 정보
orders 주문 1건의 공통값
user_id
order_date
status
total_amount
상품 수만큼 상세 행이 늘어남
order_items 상품별 반복값
상품 1행 product_id=1, unit_price=3690000
quantity=1
상품 2행 product_id=2, unit_price=359000
quantity=2
한 주문에 상품이 여러 개여도 orders 는 중복되지 않고, 상품별 수량과 주문 당시 단가는 order_items 가 행 단위로 맡습니다.
무결성

제약 조건은 잘못된 상태를 저장 전에 막습니다

입력 규칙과 참조 규칙이 함께 있어야 관계형 스키마가 무너지지 않습니다.

UNIQUE 는 회원 식별값을 하나로 유지합니다

users.username, users.email 이 중복되면 같은 사람을 여러 계정으로 취급하는 문제가 생기므로 저장 자체를 거절합니다.

CHECK 는 비정상 숫자를 차단합니다

price >= 0, stock >= 0, quantity > 0 규칙으로 음수 가격, 음수 재고, 0개 주문 같은 값을 막습니다.

FK 와 삭제 정책은 고아 데이터를 남기지 않습니다

orders.user_id 는 없는 회원을 참조할 수 없고, order_items.order_id ON DELETE CASCADE 는 주문이 지워질 때 상세도 함께 지워져 기록이 어긋나지 않게 합니다.

읽는 포인트: 이 스키마는 users / products 로 기준 데이터를 두고, orders -> order_items 로 실제 거래를 쌓습니다. 그래서 구조는 유연해지고, UNIQUE / CHECK / FK 는 그 구조가 깨지지 않게 지켜 줍니다.