而不是通过编辑使该问题复杂化,我将问我实际想要的问题.
我有两个表属性和预订.预订具有属性的外键以及开始和结束日期.
用户正在搜索空闲插槽并以天为单位提供所需的持续时间.他们还提供他们感兴趣的一系列开始日期.因此,搜索将按以下方式搜索:
“找到我所有的房产,我想要一个3天的时间段,从5月开始.”
现在我可以这样做:
1.为每个潜在的开始日运行31个查询
2.查找5月份的所有预订,将它们压缩成一个31个布尔值的数组,代表天数并循环查找插槽.
我认为(2)在大多数情况下更有效.有没有更好的算法?是否有纯sql解决方案.
我将使用Django,我的数据集很小,所以我可能会对’哑’的approuch感到满意,但我很想知道最好的算法是什么样的.
解决方法
以“写入”过程变得更复杂为代价来改进搜索的一种相对简单的方法是更改Booking表以使其成为“可用性”表.
添加一个布尔列以指示插槽是空闲还是已预订(或者更好地保留在预订它的客户的ID中,如果插槽空闲则使用0).
从2009年1月1日开始使用一个免费插槽 – > 12月31日?
当您预订时,将空闲时段分为3个(两个插入和一个更新),预订的插槽和两个可用插槽.
继续这样做,随着时间框架变得更加分散,预订流程将包括以下之一:
>为某人分配一个完整的“可用插槽”(一次更新)
>将“可用插槽”拆分为两个(一个更新和一个插入)
>如果有人从可用插槽中读出中间部分,则将插槽拆分为3(如上所述).
这并不是非常复杂的管理和搜索过程变成一个简单的查询:在所需的时间范围内找到任何可用的槽(预订= false或customerid = 0,无论你采用哪种方式)enddate – startdate> =你想要的天数.
它使预订/可用性表的大小翻倍,并使预订变得不那么简单,但权衡的是搜索过程就像它一样容易.