2016-04-24 13 views
0

Ich arbeite an einem persönlichen Projekt, um über Redis zu lernen. Ich versuche es als Datenbank für die Verwaltung eines Hotels zu verwenden. Ich versuche, mich mit Reservierungen zu befassen.Redis Modellierung Reservierungen

Das Problem ist, gibt es mehrere Räume, und jedes Zimmer kann mehrere Reservierungen haben, Datum und Datum zu speichern. Ich bin mir nur nicht sicher, wie ich das modellieren könnte, um effizient einen leeren Raum für eine bestimmte Zeit zu finden.

Momentan habe ich darüber nachgedacht, Reservierungen für jedes einzelne Zimmer in sortierten Sätzen zu speichern, aber auf diese Weise müsste ich nacheinander über die Räume iterieren, bis ich ein passendes gefunden habe.

Jede Eingabe ist willkommen. Danke

+0

Haben die Reservierungen eine feste Mindestdauer? Zum Beispiel muss jede Reservierung mindestens einen Tag haben, beginnend und endet um Mittag? – aembke

+0

Ja, es ist genau so, wie Sie es beschrieben haben. Eine Reservierung ist mindestens 24 Stunden, Beginn/Ende um Mittag. Auf der anderen Seite gibt es keine maximale Länge. –

Antwort

1

Eine Möglichkeit wäre, Sets zu verwenden, um einen Datumsbereich darzustellen, wobei jeder Satz einen Tag darstellt und durch eine Ganzzahl identifiziert wird. Mitglieder eines Sets würden dann darstellen, welche Zimmer an diesem Tag zur Reservierung zur Verfügung stehen. Da Reservierungen jeden Tag zur gleichen Zeit beginnen und enden und jede Reservierung in ganzen Tagen gemessen werden kann, können Sie jeden Tag als ganze Zahl darstellen. Um zum Beispiel der Unix-Epoche mit (1. Januar 1970) als Startzeit, heute (24. April 2016) würde 16915. Oder in JavaScript sein:

Math.floor(new Date().getTime()/(1000 * 60 * 60 * 24)); 

Sie könnten dann finden, welche Zimmer für ein bestimmtes Datum zur Verfügung stehen Bereich, indem Sie über die Tage im Eingabebereich einen Schnittpunkt festlegen. This gives you O(n * m) lookup time wobei n die Größe des kleinsten Satzes und m die Anzahl der Sätze ist. Da das Set jeden Raum höchstens einmal enthält, bedeutet dies n wird durch die Gesamtzahl der Räume begrenzt. Zum Beispiel:

var _ = require("lodash"); 

var dateToInt = function(date){ 
    return Math.floor(date.getTime()/(1000 * 60 * 60 * 24)); 
}; 

var roomsInRange = function(client, start, end, callback){ 
    client.sinter(_.range(dateToInt(start), dateToInt(end)), callback); 
}; 

Wenn ein Benutzer einen Raum für einen Datumsbereich behält würden Sie dann von jedem Satz in dem Datumsbereich, die Zimmernummer entfernen.

var _ = require("lodash"); 

var dateToInt = function(date){ 
    return Math.floor(date.getTime()/(1000 * 60 * 60 * 24)); 
}; 

var reserveRoom = function(client, start, end, room, callback){ 
    var trx = client.multi(); 
    _.each(_.range(dateToInt(start), dateToInt(end), function(day){ 
    trx.srem(day, room); 
    }); 
    trx.exec(callback); 
}; 

Dieser Ansatz dupliziert viele Daten, dass jeder Raum mehrfach dargestellt, aber die Größe wird durch die Anzahl der Zimmer und den größten Datumsbereich Sie repräsentieren müssen begrenzt. Zum Beispiel würde ich nicht denken, dass Benutzer Reservierungen 5 Jahre im Voraus buchen dürfen, noch dürfen sie Reservierungen in der Vergangenheit buchen, was bedeutet, dass Sie neben der Begrenzung der oberen Grenze des Eingabebereichs auch frühere Einträge bereinigen können. Angesichts der Tatsache, dass Keys Integer sind und die Räume wahrscheinlich auch durch Integer dargestellt werden, wäre ich überrascht, wenn dies mehr als 1 oder 2 MB für ein Jahr Reservierungen gebrauchen würde.

+0

Dies ist eine sehr interessante Art, das Problem anzugehen, und es sollte für das, was ich tue, funktionieren. Es verwendet auch Redis 'Stärken mit Sätzen. Ich bin mir nicht sicher, ich verstehe, was Async im letzten Beispiel tut. Könntest du ein wenig näher ausführen? –

+0

oh oops, ich hatte das von einer vorherigen Bearbeitung, bevor eine Redis-Transaktion verwendet wurde. habe es jetzt entfernt. – aembke

+0

Das klärt es auf. Die Lösung, die Sie zur Verfügung gestellt haben, ist klar und durchdacht und hat mir eine neue Perspektive gegeben, wie Sie kreativ denken können, wenn Sie redis und seine Funktionen nutzen. Danke, dass du dir die Zeit genommen hast, alles aufzuschreiben. –