Нужна логика поиска "доступных гостиничных номеров" - PullRequest
1 голос
/ 09 марта 2010

Скажем, у вас есть веб-сайт для пользователей, чтобы искать "гостиничные номера в аренду".

Я не знаю, как работает логика современных систем, поэтому я спрашиваю вас, ребята.

В настоящее время у меня есть два поля в форме:

  Date available from: //example 2010-04-01 // 1st april 2010
  Date available to:   //example 2010-05-01 // 1st may 2010

Тогда отправь!

Вот моя проблема: Моя поисковая система называется «Solr», и она ищет так:

 dateFrom:[$date_from TO *] AND dateTo:[* TO $date_to] 
 // $date_from and $date_to = the date inputted by the user in the html form

выше будет искать все совпадения where $date_from TO infinite AND infinite TO $date_to.

Это правильно? Лично я так не думаю ...

Как работает эта логика на сайтах бронирования?

Если вам нужно больше информации, дайте мне знать! Спасибо

UPDATE:

Кстати, когда пользователи указывают «комнату для аренды», они указывают диапазон, например, с 1 марта по 1 апреля.

Также в качестве примера: Скажем, у нас есть комната, которая свободна с 1 апреля по 1 мая.

Ответы [ 6 ]

1 голос
/ 09 марта 2010

Предполагая, что вы сохраняете, когда даты забронированы для , а не когда они свободны, вы можете, для каждого дня в диапазоне дат, найти список свободных номеров в этот день (взяв полный список номеров и вычитающих номеров, которые имеют бронирование в этот день). Затем просто возьмите этот список и отфильтруйте его по комнатам, которые свободны каждый день в диапазоне.

0 голосов
/ 22 сентября 2010

В последнее время работал над похожим проектом, и я думаю, что это действительно поможет:

http://www.experts -exchange.com / Web_Development / Web_Languages-стандарты / PHP / PHP_Databases / A_2467-комнатные Наличие-Check-For-Hotel-Motel-Guest-House-Etc.html

0 голосов
/ 10 марта 2010

Ваша логика, приведенная выше, в значительной степени верна, однако хитрость заключается в том, что база данных должна хранить не комнаты, а промежутки свободного времени в комнате, поскольку каждая комната может иметь более одного промежутка, так как ваша основная таблица может содержать несколько записей за номер

Например, для начала предположим, что у вас есть в таблице

 room      start_avail     end_avail
 1         Jan 1           Mar 1
 2         Feb 15          Mar 15

И кто-то заказывает комнату 1 на 2-15 февраля, теперь у вас есть

 1        Jan 1            Feb 1
 1        Feb 16           Mar 1
 2        Feb 15           Mar 15

Когда поступает запрос, вы в основном сравниваете его с каждым интервалом свободного времени в базе данных и находите того, кто начинается в или до запрошенной даты начала и заканчивается в или после запрошенной даты окончания. После бронирования вы удаляете временной интервал из базы данных и вставляете оставшиеся неиспользованные временные промежутки (может быть 0 1 или 2 в зависимости от того, насколько подходящим было бронирование.

Если вы планируете показать пользователю все возможные комнаты и позволить им выбрать одну, все готово. Однако, если у вас есть контроль над тем, какую комнату выбрать, вам нужно будет рассмотреть эвристику, чтобы наилучшим образом использовать ресурсы комнаты. Например, эвристика «наилучшего соответствия» всегда выбирает номер, который оставляет наименьшее количество лишних бронирований, поэтому при бронировании на 1 день предпочтение отдается 2-дневному свободному промежутку, а не одному дню в середине двухнедельного периода и сокращению на два свободных места. В противном случае предположим, что 15 марта была свободна комната, а в марте - одна. Если бронирование пришло, он может использовать любую комнату. Но затем предположим, что кто-то пришел на сайт в поисках комнаты на весь март. Если при первом бронировании использовался второй номер, вы не сможете выполнить запрос.

0 голосов
/ 10 марта 2010

Может быть, проще иметь таблицу с количеством свободных комнат на каждый день.

     DATE | FREE
    ======+=====
    10.03 | 10
    11.03 |  7
    12.03 |  6
    ...

Чтобы проверить запрос, выберите минимальное количество свободных номеров за этот период и сравните его с количеством запрошенных номеров.

    select min(FREE) from TABLE where DATE >= DATE_FROM and DATE < DATE_TO

(Извините, я не знаю "Solr")
Это работает, так как обычно нет необходимости иметь конкретную комнату, связанную с бронированием.
Номера будут распределены при регистрации.

Таблица должна обновляться при создании / подтверждении или отмене бронирования.

0 голосов
/ 10 марта 2010

Разве это не тот пример, который учителя должны использовать, чтобы убедить учеников в том, что им действительно нужно научиться применять двоичные (побитовые) операции при разработке приложений?

как:

for ($day=$firstday; $day<$lastday; $day++) {
  $testbooking=++$testbooking<<1;
  foreach ($rooms as $id=>$room) {
     $avail[$id]=($avail[$id] + (has_booking($id) ? 0 : 1)) <<1;
  }
 }
 foreach ($avail as $id=>$free_pattern) {
    if ($free_pattern & $testbooking == $testbooking) {
       return $id;
    }
 }
 return false;

Страшно - но некоторые оптимизаторы СУБД пытаются его решить.

С

0 голосов
/ 09 марта 2010

Представленная логика выглядит правильно, хотя это странный способ представить ее.

$ date_from TO бесконечно эквивалентно! SomeDate.before ($ date_from). Аналогично, $ бесконечен TO date_to ==! SomeDate.after ($ date_to).

Итак, вы ищете заказы на каждую комнату, чтобы убедиться, что их нет в период с 1 апреля по 1 мая включительно. Если между этими датами есть заказы, номер недоступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...