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.
Haben die Reservierungen eine feste Mindestdauer? Zum Beispiel muss jede Reservierung mindestens einen Tag haben, beginnend und endet um Mittag? – aembke
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. –