2012-03-10 13 views
2

私は予約システムのようなホテルの部屋にいくつかのデザインアドバイスをお探ししています。 これまでのところ多くのことを読んだことがあります。特定の日付範囲で利用可能な部屋のリストを返すクエリがあります。ホテル予約システム設計 - 複数の部屋を使用する予約

現在のところ、私の検索では、予約期間中に利用可能な部屋のみが返されます。私はこれを拡大したいので、私は複数の部屋で要求を満たすことができます。私。ユーザーが日付範囲を検索し、最初の2日間は部屋1を利用できます。その後、最後の2日間は部屋2に移動する必要があります。

現在、次のクエリを使用して空き状況を検索しています。

Dim available = From k In rooms _ 
      Group Join r In db.Reservations.Where(Function(fx) (fx.DateIn >= Date_From And fx.DateIn < Date_To) Or (fx.DateOut > Date_From And fx.DateOut <= Date_To)) On k Equals r.Room Into Group _ 
      From r In Group.DefaultIfEmpty 
      Where r Is Nothing 
      Select k 

どのようにデザインを変更したり、現在のデザインを拡張して予約ごとに複数のルームを許可することができますか?私はちょっと困りました!

ありがとうございます!

+0

私はこれをSQLでコーディングすることはできますが、SQLでコード化することができます。それが助けになるだろうか? –

+0

Angelo、 私は間違いなくいくつかのSQLを見て興味があると思います! – Tom

+0

あなたの問題を解決できますか?はいの場合はどうですか?そして、ここの答えのどれがあなたを助けましたか? –

答えて

1

最初のクエリを変更して、到着日に利用可能な部屋を単純に検索し、各部屋が降順で最長時間でソートされた場合はどうなりますか?その時間が人の滞在をカバーするのに十分であれば、あなたは完了です。そうでなければ、再発する。もう一度質問して、最初の部屋が利用できなくなった日に利用可能な部屋を検索し、各部屋が降順で最も長い時間で並べ替えられます。利用可能な部屋がない日に当たるか、その人の滞在をカバーするのに十分な部屋を見つけられるまで、続行してください。

  • ルーム1:1/1から1/10利用し、次の利用可能性を持つ3つの部屋がある - 例えば

    、あなたは1/1から予約をしたい人がいるとしましょう1/9

  • にルーム2:1/1から1/5
  • に利用可能なルーム3:1/5から1/10

に利用可能なあなたの最初のクエリがある部屋見ることであろう1/1で利用可能で、客室1と2を返すしかし、各部屋が開いている最長時間でソートしているので、一番上の結果は部屋1になります。2番目のクエリは、どの部屋が1/10で利用可能であるかを見ることです。利用できない場合)、部屋3が返ってきます。その部屋3がその人の予約を満たすのに十分な長さであると判断したら、完了です。

+0

ありがとうKevin、私はこの論理をテストして、それがどのように適合するかを見ていきます! – Tom

+0

@Tomこれは今まで働きましたか?もしそうなら、それを上向きにして、それをあなたの選択した答えとすることを検討してください。もしそうでなければ、あなたが思いついた解決策について聞いてみたいと思います。 –

0

わかりましSQLで非常に:

表のroom_bookingは

roomid INT (FK to room table), from DATE, to DATEようなので、十分なスペースが反対の問題だろうがある場合に決定される:訪問のタイムフレームでは、そこに状況がありますNO ROOMは利用できますか?だから私たちはフレームを数日で分割します(部屋はあなたのケースで1時間単位でレンタルされていませんか?

したがって、選択の前に訪問のための毎日を決定し、その後、その日ごとにあなたが持っている空き部屋の数を計算する必要があります。

次に、この:

SELECT count(roomid) - (SELECT count(id) from room) as numOfFreeRooms 
FROM room_booking 
WHERE '2012-03-10' >= from AND '2010-03-10' <= to 

た場合の任意の行を返します「0」(その日に計上されているすべての部屋を意味します)、あなたはあなたの顧客の要求を満たすことができません。

パフォーマンスがこれよりも関連性がある場合は改善することができますが、より複雑になります。

+0

アンジェロ、私は努力を感謝しますが、私はそれが私の現在のコードがしているものと本質的に同じだと思います。 私が探しているのは、開始日と終了日の全期間にわたって部屋が利用できないシナリオにコードを拡張することです。そのため、同じ期間の複数の部屋の空室状況を検索します。 – Tom

+0

@Tom私が書いたコードは気にしません部屋が利用できるのは、利用可能な部屋があれば質問だけです。したがって、10日間の期間は、1つの部屋と同じ10の異なる部屋になる可能性があります。結果は同じになります。 –

+0

@Tom期間内に毎日SQLを呼び出す必要があることに注意してください。したがって、10日間の訪問の場合は、この10回を呼び出す必要があります。 –

0

私の2番目の解決策は、(最初​​のコメントへのコメントで述べたように)かなり複雑ですが、私はそれもかなり効率的だと思います。

私はコードを投稿するのではなく、全体のコンセプトを投稿します。具体的な詳細に興味がある場合は、私ができることを見ていきます。

問題:毎日の各部屋が利用可能であるかブロックされている抽象を作成します。ゲストが訪れたい時間に利用可能な部屋に興味があります。 ゲストの移転を最小限に抑える必要のある部屋の組み合わせを選択したいと考えています。

要約:毎日が2の累乗で表される部屋/日の組み合わせの2次元マトリックスを作成します(DAYVALUE)。利用可能な部屋には対応するDAYVALUEがあります。 SEROの値としてブロックされている部屋。ですから、ROOMのすべての日を合計してROOMの組み合わせがフルタイムを達成するかどうかを判断できます。

詳細:ROOMのすべてのVALUESのSUMを取得した後、バイナリOR関数を使用して、OR演算の結果を値のSUMと比較して、指定された部屋の組み合わせが完全な滞在を満たしているかどうかを判断できますすべての日。

DAYVALUEはdayTableに格納されないことに注意してください。あなたはすべての日含むテーブルを作成する必要が

1):これは、すべての要求(2 ^(STARTDAY-DAY))

コンクリートのために計算されます。それは、日付を含む正確に1つの列を持っています(時間はなく、時間帯は1日しかありません)。私は今から百年後までのすべての日を含めることをお勧めします。 (したがって、あなたは一度だけそれを設定しなければならないでしょう)。 (注:これは、SQLクエリに一度、毎日選択することはできません問題を解決)

2)あなたは、このような出力生成VIEW作成:

DAY  ; DAYVALUE ; ROOM1 ; ROOM2; ROOM3 ; ROOM4 ; ... ; ROOMn 
20120313 ;  1 ;  0 ;  0;  1 ;  1 ; ... ; 
20120314 ;  2 ;  2 ;  0;  2 ;  2 ; ... ; 
20120315 ;  4 ;  4 ;  0;  0 ;  4 ; ... ; 
20120316 ;  8 ;  8 ;  0;  0 ;  0 ; ... ; 
20120317 ;  16 ; 16 ; 16; 16 ;  0 ; ... ; 

3)本のSUMをプロデュース。部屋値のいずれかの単一のすべての時間をDAYVALUEの合計と一致した(したがって、利用可能な場合4が2つずつのOR値を作成して成功しなかった場合

DAYVALUE ; ROOM1 ; ROOM2; ROOM3 ; ROOM4 ; ... ; ROOMn 
     31 ; 30 ; 16; 19 ;  7 ; ... ; 

4)))

5を参照してください結果のとどれもあなたが3 ROOMSなどのためにこれを続行する必要が二つの部屋のために一致しない場合DAYVALUE

ROOM1 OR ROOM2 = 30 <> 31 
ROOM1 OR ROOM3 = 31 == 31. This is a valid match of rooms. 

6)のSUMと比較します。

この手順を使用すると、訪問時に利用可能な正しい部屋のセットが常に生成されます。正しい方法でデータベースを構築する(または部屋が十分に少ない)場合、クエリは許容時間内に完了する必要があります。

楽しんでください(私が持っていました)

+0

100年に〜36,500日あります。各日が2の累乗で表される場合、DAYVALUEは2^36,500になる可能性があります。この数値を表す数値は36,500ビット(〜4.4キロバイト)です。これは、1つの部屋が1日利用可能かどうかを表すためのものです。 3万6,500日間に1部屋の空室状況を保存する場合は、4.4kb /日* 36,500日= 160,600kb(〜156メガバイト)です。利用可能な部屋の数とそれには、このデータ構造を格納するのに必要なスペースの大きさを掛けます。 –

+0

@KevinPangあなたは完全に私を誤解しました。あなたは36500日を節約しなければなりません。期間。他に何もない。もう1つは、要求ごとに呼び出され、保存されないビューです。 –

+0

私はまだそれを理解していません。あなたは、毎日が2の累乗であるDAYVALUEによって表されていると述べました。 36,500日がある場合、最大DAYVALUEは2^36,500になります。そうであれば、大きな数値を使用することによるストレージの影響について考える必要があります。 ROOM1は36,500日間でご利用いただけます。 ROOMVALUESの合計は1 + 2 + 4 + 8 + 16 + ... + 2^36,500となります。あれは正しいですか?そうであれば、これらの値とその合計をすべて格納するためのスペースが必要になります。処理時間も問題になります。 –

関連する問題