쇼핑몰 ERD: 주문과 상품을 어떻게 나눌까요?
고객이 여러 상품을 주문하는 작은 쇼핑몰을 설계해 봅시다. customers, products, orders, order_items 네 테이블로 시작합니다. 이 예제는 회원 구매와 단일 통화를 가정하며, 결제·배송·재고·환불은 별도 확장 대상으로 둡니다. 각 테이블의 역할과 주문 당시 가격을 보존하는 이유를 먼저 이해한 뒤 직접 편집해 보세요.
K는 기본키, *는 필수 컬럼입니다. 작은 화면에서는 그림을 좌우로 스크롤하거나 눌러서 크게 볼 수 있습니다.
바로 가져올 수 있는 DBML 예제
4개 테이블과 3개 외래키를 만드는 DBML입니다. 같은 주문에 같은 상품은 한 행만 허용하고 수량으로 합칩니다. 아래 예제에는 자동 ID 생성이나 금액·수량의 CHECK 제약이 포함되지 않습니다.
Table customers {
id bigint [pk]
email varchar(255) [not null, unique]
}
Table products {
id bigint [pk]
name varchar(120) [not null]
price decimal(12,2) [not null]
}
Table orders {
id bigint [pk]
customer_id bigint [not null]
ordered_at timestamp [not null]
}
Table order_items {
id bigint [pk]
order_id bigint [not null]
product_id bigint [not null]
quantity integer [not null]
unit_price decimal(12,2) [not null]
indexes {
(order_id, product_id) [unique]
}
}
Ref: orders.customer_id > customers.id
Ref: order_items.order_id > orders.id
Ref: order_items.product_id > products.id아래 버튼은 이 코드에서 만든 예제를 새 문서로 엽니다. 가입 없이 편집할 수 있으며 기존 작업은 보관됩니다. 직접 가져오려면 코드를 복사해 편집기의 가져오기에 붙여넣으세요.
이 예제로 시작하기 →테이블마다 한 가지 역할 정하기
customers는 고객, products는 현재 판매 중인 상품, orders는 구매 한 건의 고객·시점을 저장합니다. order_items는 그 주문에 어떤 상품을 몇 개, 얼마에 샀는지를 기록합니다. 주문마다 상품 컬럼을 product_1, product_2처럼 늘리지 않아도 여러 상품을 담을 수 있습니다.
가격이 바뀌어도 과거 주문 금액은 유지하기
products.price는 현재 가격이고 order_items.unit_price는 주문이 확정될 때 기록한 단가입니다. 예를 들어 10,000원짜리 상품 두 개를 주문한 뒤 상품 가격이 12,000원으로 바뀌어도 주문상세는 10,000 × 2를 유지합니다. 값을 복사하는 동작은 FK가 대신하지 않으므로 주문 처리 로직에서 기록해야 합니다. 할인·세금·배송비를 추가한다면 결제 금액 계산 규칙도 별도로 정하세요.
같은 상품을 여러 행으로 담을 수 있나요?
이 예제의 UNIQUE(order_id, product_id)는 동일 상품의 중복 행을 막습니다. 두 개를 사면 quantity를 2로 바꿉니다. 옵션·개별 할인·분할 출고 때문에 같은 상품을 여러 행에 넣어야 한다면 이 고유 조건을 바꾸고, variant_id나 주문 내 line_number처럼 행을 구분할 기준을 정하세요. id 기본키만으로는 주문·상품 조합의 중복을 막지 못합니다.
최소 예제에서 실제 서비스로 확장하기
수량은 양수, 가격은 음수가 아니어야 한다는 규칙을 실제 DB의 CHECK 제약과 입력 검증에 반영하세요. 이 예제는 그 제약을 포함하지 않습니다. 여러 통화를 받는다면 통화 코드와 소수 자릿수 정책도 필요합니다. 고객·상품 삭제가 주문 이력을 없애지 않도록 삭제 정책을 정하고, 회원 탈퇴 처리·배송지 스냅샷·결제 내역은 별도 요구사항으로 설계하세요.
직접 해보기: 주문상세에 상품명 보존
이 예제로 시작하기를 누르고 order_items에 product_name varchar(120) 컬럼을 추가해 보세요. 단가와 마찬가지로 주문 당시 상품명을 기록하면 상품명이 바뀌어도 주문 이력을 설명할 수 있습니다. 이 값도 주문 처리 시 복사해야 합니다. 변경한 구조를 PNG로 출력하고 JSON으로 백업하세요.
예제 열고 실습하기 →지금 무료로 사용할 수 있는 기능
현재 Free에서 DBML·Schema Studio JSON 가져오기와 내보내기, 테이블·관계 편집을 제공합니다. 로그인 후 클라우드에 저장할 수 있으며 중요한 작업은 JSON으로 백업하세요. 지원 범위의 PostgreSQL·MySQL DDL 가져오기, PostgreSQL 수집 쿼리와 PNG 출력도 무료입니다. SQL·SVG 출력은 준비 중입니다. MySQL 입력은 PostgreSQL 문서 모델로 변환되며 원본과 경고를 확인하세요.
요금제와 저장 한도 확인 →