sql – 在预订系统中查找空闲插槽

前端之家收集整理的这篇文章主要介绍了sql – 在预订系统中查找空闲插槽前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
my question about searching for date ranges我尝试简化问题,无意中提出了一个不同的更简单的问题.

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

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

用户正在搜索空闲插槽并以天为单位提供所需的持续时间.他们还提供他们感兴趣的一系列开始日期.因此,搜索将按以下方式搜索
“找到我所有的房产,我想要一个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> =你想要的天数.

它使预订/可用性表的大小翻倍,并使预订变得不那么简单,但权衡的是搜索过程就像它一样容易.

猜你在找的MsSQL相关文章