※ この募集は締め切られました。
席予約システムにおけるDB設計の相談
【概要】
席予約システムにおけるDB設計についてアドバイスをいただきたいです。
【目的】
保守性・再利用性、検索時のパフォーマンスが高いDBを設計すること
【募集背景】
現在とある案件で席予約システムを実装しております。
その際のDB設計で迷っております。
【使用技術】
・PHP 8系
・Laravel 8系
・MySQL 8系
【要件】
まだ予約されていない空席情報のみをレスポンスする。
(最短予約時間は30分)
------
(例)
添付いたしました写真を例にしますと、
A席 : 2022/3/20 12:00〜17:00まで予約可能のとき、
・予約1 A席 : 2022/3/20 12:00〜14:00
・予約2 A席 : 2022/3/20 15:00〜17:00
の予約が入っていた場合、
・席名 : A席
・開始日時 : 2022-03-20 14:00
・終了日時 : 2022-03-20 15:00
をレスポンスします。
------
はじめは予約された日時のみをテーブルに格納していたのですが、
そのままでは間に入っている空席を返すのが難しいと考えました。
そこで、すべての30分ごとの時間枠を格納した
時間テーブル(times)を用意することを考えました。
【reservations】
・id : PK
・user_id : FK
【seats】
・id : PK
・name
【times】
・id : PK
・reservation_id : FK, nullable
・seat_id : FK
・start_on 予約開始日時
・end_on 予約終了日時
------
(例)
A席 : 2022/3/20 9:00〜17:00まで予約可能な場合
・id = 1
・star_on = 2022-03-20 09:00:00
・end_on = 2022-03-20 09:30:00
・id = 2
・star_on = 2022-03-20 09:30:00
・end_on = 2022-03-20 10:00:00
・id = 3
・star_on = 2022-03-20 10:00:00
・end_on = 2022-03-20 10:30:00
...
------
9:00〜10:00を予約した場合は2レコード分reservationsと紐づくイメージです。
reservation_id=nullか否かで空席がどうかを判断できると思います。
ただ、この設計ではレコード数が膨大になってしまうという欠点があります。
再利用性・保守性・パフォーマンスが上がるアイデアがございましたら
お力をいただきたいです!
【コミュニケーション方法】
チャットのみ
【ご提案時のお願い】
単発プランを設定されていない方は、提示いたしました予算内で
プランの作成をお願いいたします!
契約期間はご対応可能時間帯にもよりますが、一週間以内を想定しております。
【契約後】
コミュニケーションの際はER図の一例をご提示いただくと助かります!
また実際のクエリビルダ・Eloquantの一例までいただけますとたいへん励みになります。