「順番待ちシステム」のDB設計〜履歴を取れる版〜

データベース設計 データベース

本記事は「順番待ちシステム」に関するDB設計の提案を記載します。

この設計はあくまで一例です。
これを雛形として、ご自分の構築したいシステムに合わせてご利用ください。

概要

いつお客様が来たのか、いつ呼び出されたのかを記録します。キャンセルもできます。
待ち人数はcounter_historiesの指定したcounter_idのうち、checked_out_at、canceled_atが入っているものを除く件数となります。(以下SQLを参考)

SELECT COUNT(*) FROM counter_histories WHERE checked_out_at IS NULL OR canceled_at IS NULL;
SQL

ログイン機能や課金機能、ユーザー登録機能などは、本記事とは切り離して考えられるので、ここには含みません。(別記事にする予定です)
そのため、エンドユーザーへの順番伝達はエンドユーザー自身に覚えてもらう必要があります。
代替案としては番号札を渡す、その場でQRコードなどを読み込んでもらうなどがあります。

これくらいの機能があれば、サービスとして最低限運用できるのではないでしょうか。

設計詳細

ER図

erDiagram shop ||--o{ counters : hasMany counters ||--o{ counter_histories : hasMany shop { int id varchar email varchar name } counters { int id int shop_id varchar name } counter_histories { int id int counter_id varchar name datetime checked_in_at datetime checked_out_at datetime canceled_at }

テーブル

shops: 店舗

物理名論理名Null備考
idIDintprimary
emailメールアドレスvarchar(255)unique
name店舗名varchar(255)

counters: カウンター

nameには日付を入れたり任意の名称を入れる想定です。

物理名論理名Null備考
idIDintprimary
shop_id店舗IDint
nameカウンター名varchar(255)

counter_histories: カウンター履歴

nameは待っている人の名前や、診察券番号など、公開している行列に表示されるものを想定。
checked_out_atは呼び出された際に日時を入れます。言葉的にこれで良いのかはちょっと分からなかったので、適切なカラム名がわかる方は指摘して頂けると助かります。

物理名論理名Null備考
idIDintprimary
counter_idカウンターIDint
name待っている人の名前varchar(255)YES
checked_in_at並び始めた日時datetime
checked_out_at呼び出された日時datetimeYES
canceled_atキャンセルした日時datetimeYES

その他

他にも入れたい機能とかを書き留めておきます。

  • 順番になっても来なくて後回しにするフラグ
  • 順番を前後することが可能(カウンター席が空いたので1名様を優先的に案内など)
  • お客様のメールアドレス
    • 呼び出しを行ったかどうかフラグ
    • 事前呼び出し設定(自分の順番があと5人未満になった時とかに呼び出す)

Follow me!

コメント

PAGE TOP
タイトルとURLをコピーしました