2016-08-02 25 views
-1

Da ich versuche, ein Hotelbuchungssystem zu entwickeln, bin ich neugierig, welcher Ansatz für die Systemarchitektur am besten ist. Vorerst habe ich Hotel-Zimmer-Details, Kundendetails und Buchungsdetails, wenn ein Kunde an einem bestimmten Datum ein Hotelzimmer reserviert.Hotel Buchung Systemarchitektur für Zimmer verfügbar Effizienz

Zimmer verfügbar = Total Room - Zimmer reserviert

Jetzt verwende ich eine Abfrage Raum abzurufen verfügbar gegeben zu diesem Zeitpunkt auf der Grundlage des Zimmer reserviert auf dem bestimmten Datum gemacht, dass Kunden gewählt. Zum Beispiel, Kunden buchen ein Zimmer von 3 August 2016 bis 6 August 2016. Dann werde ich das Datum zwischen 3. August - 6. August von Buchungsdetails abrufen. Ich werde jeden Tag in diese SQL-Anweisung schreiben.

Dann werde ich das Datum nehmen, um das reservierte Zimmer zusammenzufassen und das Total Zimmer zu bekommen. Diese Anweisung wird ausgelöst, wenn der Kunde das Datum

auswählt. Oder ich sollte eine weitere Tabelle als verfügbarer Raum erstellen und einen 5-Jahres-Kalender mit dem gesamten Raum speichern. Es wird abgeleitet, wenn der Kunde eine Zimmerbuchung vorgenommen hat.

Antwort

0

Ich glaube nicht, dass Sie andere Tabellen benötigen.
Sie müssen nur für alle gebuchten Zimmer suchen und sie auszuschließen:

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

jedoch, dass Abfrage Räume gibt, die nur für den gesamten Zeitraum zur Verfügung stehen. Hier ist die Abfrage, um alle verfügbaren Räume nach Tagen (innerhalb von 255 Tagen) anzuzeigen:

;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

Statt im Detail von jedem Zimmer, was ich habe, ist allgemeine Hotelzimmer Informationen für den Tisch. Zum Beispiel Gesamt Zimmer, Typen, Preis und allgemeine Beschreibung für die Hotelzimmer Details. Daher kann ich Room_ID nicht verwenden, um es herauszufiltern. – hiboss

+0

Also, das ist wahrscheinlich eine Antwort auf Ihre Frage. Sie benötigen mindestens drei Tabellen: tbl_Rooms (ID, Number, Type, Floor, Etc); tbl_Bookings (Room_ID, Client_ID, Datum); tbl_Clients (ID, Name, usw.); Wenn Sie versuchen, einen Datumsbereich in der Tabelle tbl_Bookings zu verwenden, müssen Sie meine zweite Abfrage neu schreiben. –