而不是通过编辑使该问题复杂化,我将要问的是我实际想要的问题。
我有两个表Property和Booking。预订具有属性的外键以及开始和结束日期。
用户正在搜索空闲时段,并以天为单位提供所需的持续时间。他们还提供了他们感兴趣的开始日期范围。因此,搜索将遵循以下路线:“找到我想要的3天时段(可在5月的任何时间开始)的所有属性。”
现在,我可以这样操作:1.为每个潜在的开始日期运行31个查询。2.查找五月份的所有预订,将它们压缩为一个代表天的31个布尔值的数组,并循环寻找空位。
我认为(2)在大多数情况下效率更高。有没有更好的算法?是否有一个纯SQL解决方案。
我将使用Django,并且我的数据集很小,因此我可能会以“哑巴”的姿态感到满意,但我很好奇知道最好的算法是什么样子。
可能对您的应用程序有过大的杀伤力,但是:
以使“写入”过程变得更复杂为代价的一种相对简单的改善搜索的方法,是将Booking表更改为“ Availability”表。
添加一个布尔列以指示该广告位是空闲还是已预订(或者最好还是将其预订的客户的ID放入,如果该广告位是空闲的,则使用0)。
从2009年1月1日开始-> 12月31日开始使用一个免费插槽开始?
预订时,将可用插槽分成3个(两个插入和一个更新),已预订的插槽和两个可用插槽。
继续这样做,随着时间变得更加分散,预订过程将包括以下内容之一:
管理起来并不是那么复杂,搜索过程变成了一个简单的查询:在所需的时间范围内找到所有可用的空位(booked = false或customerid = 0,无论您采用哪种方式),其中enddate-startdate> = number你想要的日子。
它使预订/可用性表的大小增加了一倍,并使预订变得不那么简单,但是要权衡的是,搜索过程非常容易。