ErdForge데이터 모델링 워크스페이스 · v1.0.2

Reservation example

예약 서비스 ERD 예시

공간, 예약 가능 시간, 예약, 결제, 취소 이력을 분리해 중복 예약을 줄이는 예약 서비스 ERD 예시입니다.

상황

예약 서비스 ERD 예시

회의실, 숙소, 클래스처럼 사용자가 특정 리소스와 시간대를 선택해 예약하는 서비스입니다.

핵심 테이블

resources, availability_slots, reservations

중요 관계

resources 1:N availability_slots

주의점

시간 겹침과 취소 이력

요구사항

요구사항

  • 운영자는 예약 가능한 리소스와 시간대를 등록합니다.
  • 사용자는 한 시간대를 예약하고 결제할 수 있습니다.
  • 예약 취소와 환불 사유는 나중에 CS에서 조회할 수 있어야 합니다.

테이블 설계

테이블 설계

users예약 사용자
  • id PK
  • email UNIQUE
  • name
  • phone
resources예약 대상
  • id PK
  • name
  • type
  • capacity
  • status
availability_slots예약 가능 시간
  • id PK
  • resource_id FK
  • starts_at
  • ends_at
  • status
reservations예약 건
  • id PK
  • user_id FK
  • slot_id FK
  • status
  • reserved_at
reservation_payments예약 결제
  • id PK
  • reservation_id FK
  • amount
  • status
  • paid_at
cancellations취소 이력
  • id PK
  • reservation_id FK
  • reason
  • cancelled_at

관계

관계

resources 1:N availability_slotsavailability_slots 1:1 reservationsusers 1:N reservationsreservations 1:N reservation_paymentsreservations 1:1 cancellations

설계 포인트

설계 포인트

가능 시간과 예약을 분리합니다

availability_slots는 공급자가 열어 둔 시간이고 reservations는 사용자가 점유한 결과입니다. 둘을 분리하면 임시 홀드, 취소, 재오픈을 표현하기 쉽습니다.

중복 예약은 DB 제약과 애플리케이션 락을 같이 씁니다

slot_id에 UNIQUE를 두면 같은 슬롯을 두 번 예약하는 실수를 막을 수 있습니다. 시간 범위 직접 선택형 서비스라면 exclusion constraint도 검토합니다.

취소는 삭제보다 이력으로 남깁니다

예약 레코드를 삭제하면 고객 응대와 정산 근거가 사라집니다. cancellations 테이블로 사유와 시점을 별도로 보관합니다.

구현 전 체크

구현 전 체크

  • reservations.slot_id는 UNIQUE로 두어 같은 슬롯의 중복 예약을 막습니다.
  • starts_at과 ends_at에는 시간대 정책을 명확히 적용합니다.
  • 취소 후 재예약 가능한 정책이면 slot.status를 함께 갱신합니다.

다른 ERD 예시

다른 ERD 예시

예시를 그대로 따라 그리거나, 가입 전 데모 캔버스에서 테이블과 관계를 먼저 만져볼 수 있습니다.