搜索“可用的酒店房间”的逻辑需要帮助

时间:2010-03-09 18:11:24

标签: java php mysql html database

假设您有一个网站供用户搜索“酒店房间出租”。

我不知道当前系统的逻辑是如何工作的,这就是我问你们的原因。

我目前在表单中有两个字段:

  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.

这是对的吗?我不这么认为......

此逻辑如何在预订网站上发挥作用?

如果您需要更多输入,请告诉我们! 感谢

更新:

顺便说一句,每当用户指定“出租房间”时,他们都会指定一个范围,例如3月1日到4月1日。

另外作为一个例子: 假设我们在4月1日至5月1日之间有一个免费的房间。

6 个答案:

答案 0 :(得分:1)

假设您存储日期 而不是空闲时,您可以在日期范围内的每一天查找当天免费房间列表(通过总计当天预订的房间和减去房间的清单。然后,只需获取此列表并将其过滤到该范围内每天免费的房间。

答案 1 :(得分:0)

给出的逻辑确实看起来是正确的,尽管这是一种奇怪的呈现方式。

$ date_from TO infinite等同于!someDate.before($ date_from)。同样,$ infinite TO date_to ==!someDate.after($ date_to)。

所以,你正在寻找每个房间的预订,以确保4月1日至5月1日期间没有预订,包括在内。如果这些日期之间有预订,则房间不可用。

答案 2 :(得分:0)

这不是教师用来说服学生他们确实需要学习如何在应用程序编程中应用二进制(按位)操作的示例吗?

像:

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;

可怕 - 但是它的一些DBMS优化器会如何尝试并解决它。

下进行。

答案 3 :(得分:0)

也许每天都有一张桌子可以容纳免费房间。

     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”)
这是有效的,因为通常不需要与预订相关的具体空间 办理入住手续时,客房将分发

创建/确认或取消预订时,必须更新表格。

答案 4 :(得分:0)

上面的逻辑是非常正确的,但诀窍是数据库不应该存储房间,而是在房间内空闲时间,因为每个房间可能有多个跨度,因此您的主表可能包含多个条目每个房间

例如,假设您已在表格

中开始
 room      start_avail     end_avail
 1         Jan 1           Mar 1
 2         Feb 15          Mar 15

有人在2月2日至15日预订1号房间,现在你已经

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

当请求进入时,您基本上将其与数据库中的每个空闲时间跨度进行比较,并找到在请求的开始日期之前或之前开始并在请求的结束日期之后或之后结束的人。一旦预订,您将从数据库中删除时间跨度并插入未使用的剩余时间段(可能是0 1或2,具体取决于预订的合适程度。

如果您计划向用户显示所有可能的房间并让他们选择一个房间,那么您就完成了。但是,如果您可以控制选择哪个房间,则需要考虑启发式以最好地利用您的房间资源。例如,“最适合”的启发式方法总是会选择留出未预订的最小额外时间的房间,因此1天预订将更喜欢2天的免费跨度而不是在两周的跨度中花费一天并切割它分成两个freespans。否则,假设3月15日有一个免费的房间,3月份有一个房间。如果预订进来,它可以使用任何一个房间。但接下来假设有人来到网站寻找整个三月的房间。如果第一次预订使用了第二个房间,您将无法填写请求。

答案 5 :(得分:0)