Spring Boot に入門した話〜架空のキャンプ場の予約アプリを Elastic Beanstalk にデプロイするまで〜①要件定義・DB設計編

Spring Boot を触ってみたので、ある程度の大きさのものをと「架空のキャンプ場の予約アプリ」を作ってみた話です。各工程で考慮したこと等をメモしておきます。

成果物

今回作ったものです。

URL:Aozora Camp Reservation - Top

ソースコード(demoがあります):

github.com

前提

  • キャンプ場の予約方法といえば、Web予約以外にも電話予約や店頭予約等が考えられます。その他の方法で受け付けた予約とWeb予約を同期させるには、別途管理者機能(アプリ)が必要となるでしょう。また、(キャンプ)サイトの在庫数を管理するのにも管理者機能が必要です。ですが、今回のアプリではそこは対象外とし、「キャンプ場のWeb予約」に絞って作っていきます。
  • キャンプ場の予約機能だけ存在する、ということはまずないと思います。ここでは、既に自社HPを持っており、そこから呼び出されるアプリケーションを想定しています。

要件定義

はじめにざっくりと要件を決めて、スコープを定めます。1ヶ月で作れる程度の規模を想定しました。

ユーザーストーリー

  • 利用者は、インターネット経由でキャンプ場のサイトが予約できる。
  • 利用者は、会員、非会員ともにサイト予約できる。
  • 利用者は、予約したいサイトの空き状況を確認できる。
  • 利用者は、予約の際に確認した料金をチェックイン当日現地清算する。
  • 利用者は、スマートフォンからも同じように予約できる。
  • 会員は、登録した会員情報を更新できる。
  • 会員は、予約内容の確認ができる。
  • 会員は、予約のキャンセルができる。

今回は対象外

  • メール認証、通知
  • 請求、支払
  • 管理者機能(アプリ)

業務ルール

  • 予約は、翌日〜90日間までの分を受け付ける。
  • 予約のキャンセルは、チェックインの3日前まで可能。

機能一覧

  • キャンプサイト予約
    • サイトタイプ一覧
    • スケジュール
    • 宿泊情報入力
    • 予約(会員)
    • 予約(非会員)
  • マイページ
    • ログイン
    • 会員登録
    • 基本情報更新
    • メールアドレス変更
    • パスワード変更
    • 予約一覧
    • 予約詳細
    • 予約キャンセル

画面遷移図

https://i.gyazo.com/463fe3fa5478ad6fb0b714ce31595283.png

DB設計

今回、RDBMSにはPostgreSQLを使います。

ER図

  • reservationsテーブル、reservation_detailsテーブル
    • 料金周りは、本来であれば請求用のテーブルに分けますが、今回は手間なのでreservationsreservation_detailsに持たせています。
  • site_typesデーブル
    • list_img_urlにはS3に格納した画像のURLが入ります。
    • capacityには宿泊可能人数が入ります。
  • calendarテーブル
    • 日付に対応する料金タイプが登録されています。
  • site_availavilityテーブル
    • サイトタイプ及び日付別の在庫管理テーブルです。本来であれば、管理者によって管理されています。

gyazo.com

制約

  • 各テーブルの参照キーには、外部キー制約を付与しています。
  • reservationsテーブルは非正規化された状態です。予約者情報について言うと、会員予約の場合はmember_idが、非会員予約の場合は予約者情報(non_member_name, non_member_mail, non_member_phone_number)が入ります。今回は、チェック制約よって、テーブルを守る設計としました。正規化してテーブルを分けてしまうのもよいと思います。
     

「②開発編」 に続きます。