admin

在预订系统中查找空闲时段

sql

而不是通过编辑使该问题复杂化,我将要问的是我实际想要的问题。

我有两个表Property和Booking。预订具有属性的外键以及开始和结束日期。

用户正在搜索空闲时段,并以天为单位提供所需的持续时间。他们还提供了他们感兴趣的开始日期范围。因此,搜索将遵循以下路线:“找到我想要的3天时段(可在5月的任何时间开始)的所有属性。”

现在,我可以这样操作:1.为每个潜在的开始日期运行31个查询。2.查找五月份的所有预订,将它们压缩为一个代表天的31个布尔值的数组,并循环寻找空位。

我认为(2)在大多数情况下效率更高。有没有更好的算法?是否有一个纯SQL解决方案。

我将使用Django,并且我的数据集很小,因此我可能会以“哑巴”的姿态感到满意,但我很好奇知道最好的算法是什么样子。


阅读 139

收藏
2021-05-10

共1个答案

admin

可能对您的应用程序有过大的杀伤力,但是:

以使“写入”过程变得更复杂为代价的一种相对简单的改善搜索的方法,是将Booking表更改为“ Availability”表。

添加一个布尔列以指示该广告位是空闲还是已预订(或者最好还是将其预订的客户的ID放入,如果该广告位是空闲的,则使用0)。

从2009年1月1日开始-> 12月31日开始使用一个免费插槽开始?

预订时,将可用插槽分成3个(两个插入和一个更新),已预订的插槽和两个可用插槽。

继续这样做,随着时间变得更加分散,预订过程将包括以下内容之一:

  • 将整个“可用插槽”分配给某人(一个更新)
  • 将“可用插槽”分为两个(一个更新和一个插入)
  • 如果有人从可用插槽中预订中间部分,则将插槽分成3个(如上所述)。

管理起来并不是那么复杂,搜索过程变成了一个简单的查询:在所需的时间范围内找到所有可用的空位(booked = false或customerid =
0,无论您采用哪种方式),其中enddate-startdate> = number你想要的日子。

它使预订/可用性表的大小增加了一倍,并使预订变得不那么简单,但是要权衡的是,搜索过程非常容易。

2021-05-10