2016-08-02 11 views
-1

私はホテル予約システムを開発しようとしているので、どのアプローチがシステムアーキテクチャに最も適しているのか不思議です。今のところ、特定の日付にホテルルームを予約すると、ホテルルームの詳細、顧客の詳細、予約の詳細が表示されます。客室利用可能な効率のための予約システムアーキテクチャ

ルーム利用可能=合計ルーム - ルーム予約

今私は、顧客が選択した特定の日に撮影した予約の部屋に基づいて、指定されたその日に利用できる部屋を検索するためのクエリを使用しています。たとえば、顧客は3 August 2016から6 August 2016までの部屋を予約します。 8月3日から8月6日の間に予約の詳細から日付を取得します。私は毎日このSQL文にループします。

Select * from bookingDetails where theDate between StartDate and EndDate and RoomType = 'Something' 

次に、予約された部屋を合計し、合計ルームを取得するように日付を設定します。 このステートメントは、お客様が日付を選択したときにトリガーされます

またはもう1つのテーブルを使用可能ルームとして作成し、合計ルームで5年カレンダーを保存する必要があります。顧客がいつ予約をしたかを推測します。

答えて

0

他のテーブルは必要ありません。

Select * 
from tbl_Rooms 
WHERE RoomType = 'Something' and 
    Room_ID not in (
     Select Room_ID 
     from bookingDetails 
     where theDate between @StartDate and @EndDate 
    ); 

は、しかし、そのクエリはONLY全期間のために利用可能なお部屋を、返し


あなたはすべて予約した部屋を探し、それらを除外しなければなりません。利用可能なすべての部屋を日数(255日以内)で表示するクエリは次のとおりです。

;WITH Pass0 as (SELECT * FROM (VALUES (1),(1),(1),(1)) as A(C)), 
    Pass1 as (select 1 as C from Pass0 as A, Pass0 as B),--16 rows 
    Pass2 as (select 1 as C from Pass1 as A, Pass1 as B),--256 rows 
    Dates as (SELECT DATEADD(d,ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1,@StartDate) as AvailDate FROM Pass2) 
SELECT d.AvailDate, r.* FROM tbl_Rooms as r 
INNER JOIN Dates as d ON AvailDate < @EndDate 
WHERE NOT EXISTS (SELECT 1 FROM bookingDetails as b WHERE b.theDate = d.AvailDate and b.Room_ID = r.Room_ID) 
ORDER BY r.Room_Number, d.AvailDate; 
+0

各部屋の詳細ではなく、テーブルの一般的な客室情報です。例えば、部屋、タイプ、価格、ホテルの詳細の一般的な説明など。したがって、私はそれをフィルタにするためにRoom_IDを使用することはできません。 – hiboss

+0

それはおそらくあなたの質問に対する答えでしょう。 tbl_Rooms(ID、Number、Type、Floor、Etc);少なくとも3つのテーブルが必要です。 tbl_Bookings(Room_ID、Client_ID、Date); tbl_Clients(ID、名前など); tbl_Bookingsテーブルで日付範囲を使用しようとすると、2番目のクエリを書き直す必要があります。 –

関連する問題