1

レンタカー会社の予約システムを作成しましたが、車の空き状況の設定に問題があります。

それがどのように機能するかの簡単な例は、予約されたときに、1台の車がyesデータベース内の次のフィールドの値を受け取ることです。bookedout

さて、例として、10台の車があるとしましょう(これは非現実的に小さいですが、要点を示しています)

これらの1つはアウディR8です。

今日の日付は2012年3月6日です。

ユーザーは、3月26日から3月31日まで車を予約します。しかし、彼らは今日ウェブサイトを通してその予約をします。bookedoutすぐに値を設定することはできません。そうしないyesと、ウェブサイトは実際に3月6日から3月31日まで車が利用できないと見なします。

このシナリオは会社のお金を失うでしょう。

そのため、サーバー上に配置され、現在の日付をチェックしてから、データベースを毎日チェックするスクリプトのようなものを探しています。たとえば、今日の日付に開始する予定の予約がある場合、データベース内の値が変更されるため、車はこの日から予約できなくなります。

次に、車が返却される予定の日付に値を戻すように調整することもできます。

私は特にコードを探しているわけではありませんが(例にノーとは言いませんが)、これまでにこれを行ったことがないので、このようなことを理解するための出発点にすぎません。

基本的に、特定の日付にユーザーの操作なしでクエリをトリガーする方法が必要です。

どんな助けでも真剣にいただければ幸いです。:)

4

2 に答える 2

6

この特定の質問に答える必要はないと思うので、コードを投稿するつもりはありませんが、これを回答フォームでもう少し具体化します。

データベース構造は次のようになります(マイレージ、損傷など、レンタカー会社が必要とする多くのフィールドは、簡潔にするために省略されています)。

  • car_id
  • 作る
  • モデル

顧客

  • 顧客ID
  • ファーストネーム
  • 苗字
  • 電子メールアドレス

予約

  • reserved_id
  • car_id
  • 顧客ID
  • 開始日
  • 終了日

アイデアは、予約ステータスをで保存することは決してないということですcar。代わりに、reservationwithstart_dateを作成しend_date、予約の日付に設定します。

特定の日付範囲で利用可能な車をチェックするためのクエリは次のようになります。

SELECT
    c.car_id
FROM
    cars c 
    LEFT JOIN reservations r ON (
       c.car_id = r.car_id
       AND r.start_date <= $reservationEndDate
       AND r.end_date >= $reservationStartDate
    )
WHERE
    r.reservation_id IS NULL

このモデルを使用すると、車の予約状況を更新するために時間ベースのジョブを実行することを心配する必要はありません。ただし、アプリケーションを最適化するために、車のステータスを更新する毎日のジョブを実行して、現在利用可能な車の数をすばやく確認することができます

追記

NBがコメントで指摘したように、アプリケーションで予約テーブルの日付範囲の競合が許可されていないことを確認する必要があります。これを解決できる一意のインデックスはないため、アプリケーションロジックでこれを処理する必要があります。競合状態に注意してください。考えられる解決策は、誰かが特定の日付範囲で車を見るとすぐに一時的な予約を作成することです。

別の追記

注意:上記の問題を回避するための良い提案もありました。データベーストリガーを使用してサーバー側で検証します。競合する別の予約が作成された場合、データベースはトリガーのINSERTを拒否できます。このソリューションは、検証を可能な限りデータに近づけるため、非常に優れている可能性があります(したがって、アプリケーションでそれを「忘れる」ことはできません)。

于 2013-03-06T16:09:11.677 に答える
1

あなたの質問に対する文字通りの答えはcronです(* nixシステムで実行していると仮定します)。

ただし、実際にはそうする必要はありません。cronジョブを実行するたびに予約を含むテーブルをクエリする必要があるため、非常に脆弱です。つまり、車の予約がどのように機能するかを知っている場所が3つあるということです(cronジョブ、予約テーブル、およびアプリケーション)。

予約テーブルに参加することで、車を予約できないと言うのははるかに簡単です。特定の日付に有効な予約がある場合、その車は利用できないと見なすことができます。

スキーマについていくつかの仮定を立てると、次のようになります。

select 'booked'
from   cars c, 
       bookings b
where  c.car_id = b.car_id
and    b.start_date < ?required_date 
and    b.end_date   > ?required_date
union
select 'free'
from   cars c, 
       bookings b
where  c.car_id = b.car_id
and    b.start_date >= ?required_date 
or    b.end_date   <= ?required_date
于 2013-03-06T16:08:36.107 に答える