Commerce example
쇼핑몰 주문 ERD 예시
고객, 주문, 주문 항목, 상품, 결제, 배송 테이블로 쇼핑몰 주문 ERD를 설계하는 실제 예시입니다.
상황
쇼핑몰 주문 ERD 예시
상품을 장바구니에 담고 주문하면 결제와 배송 상태를 추적해야 하는 일반적인 쇼핑몰 주문 흐름입니다.
핵심 테이블
users, orders, order_items, products
중요 관계
orders 1:N order_items
주의점
주문 당시 가격과 상품 현재 가격 분리
요구사항
요구사항
- 회원은 여러 주문을 만들 수 있고, 주문은 반드시 한 회원에 속합니다.
- 한 주문에는 여러 상품 라인이 들어가며, 각 라인에는 수량과 주문 당시 단가가 필요합니다.
- 결제와 배송은 주문 상태와 별도로 이력을 추적할 수 있어야 합니다.
테이블 설계
테이블 설계
users구매 회원- id PK
- email UNIQUE
- name
- created_at
products판매 상품- id PK
- name
- sku UNIQUE
- current_price
- stock_quantity
orders주문 헤더- id PK
- user_id FK
- status
- ordered_at
- total_amount
order_items주문 상품 라인- id PK
- order_id FK
- product_id FK
- quantity
- unit_price
payments결제 시도와 승인- id PK
- order_id FK
- provider
- status
- approved_at
shipments배송 상태- id PK
- order_id FK
- carrier
- tracking_number
- shipped_at
관계
관계
users 1:N ordersorders 1:N order_itemsproducts 1:N order_itemsorders 1:N paymentsorders 1:1 shipments
설계 포인트
설계 포인트
상품 가격은 주문 라인에 복사합니다
상품의 현재 가격은 바뀔 수 있으므로 주문 당시 단가는 order_items.unit_price에 저장해야 매출과 환불 계산이 흔들리지 않습니다.
주문 상태와 결제 상태를 분리합니다
주문은 생성됐지만 결제가 실패하거나 재시도될 수 있습니다. payments를 분리하면 결제 이력과 주문 처리 상태를 독립적으로 관리할 수 있습니다.
배송은 주문 기준으로 시작하고 필요하면 분할 배송으로 확장합니다
초기에는 orders 1:1 shipments로 충분하지만 부분 배송이 필요해지면 orders 1:N shipments로 바꾸면 됩니다.
구현 전 체크
구현 전 체크
- orders.user_id, order_items.order_id, order_items.product_id에 FK를 둡니다.
- products.sku와 users.email은 중복을 막기 위해 UNIQUE로 둡니다.
- status 컬럼은 enum 또는 체크 제약으로 허용 값을 제한합니다.
다른 ERD 예시
다른 ERD 예시
예시를 그대로 따라 그리거나, 가입 전 데모 캔버스에서 테이블과 관계를 먼저 만져볼 수 있습니다.