当前位置: 首页 > 面试题库 >

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

奚和光
2023-03-14
问题内容

在有关搜索日期范围的问题中,我尝试简化问题,并无意间提出了另一个更简单的问题。

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

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

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

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

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

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


问题答案:

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

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

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

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

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

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

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

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

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



 类似资料:
  • 问题内容: 预订表包含预订的开始日期,开始时间和持续时间。开始时间是工作日8:00 .. 18:00的半小时增量。持续时间每天也以半小时为增量。 如果需要,表结构可以更改。 如何在未保留的表中查找第一个免费的半小时?如果表包含 结果应该是: 可能应该使用PostgreSql 9.2窗口函数来查找starthour大于上一行starthour + duration的第一行。 如何编写返回此信息的se

  • 我们有一个简单的微服务设置,基于Windows服务器上的Spring Boot和Java8。 许多服务的负载很低,因为它们是与各种外部合作伙伴的集成。所以它们很多时候都是空闲的。 问题在于,JVM 仅在触发垃圾回收时才会将内存释放回操作系统。因此,服务可能会开始使用32mb,然后为单个请求提供服务并分配2GB内存。如果该服务上没有其他活动,则不会受到 GC 和服务器上的其他服务的影响。 使用Sys

  • 问题内容: 我将CloudFlare用于我的一个高流量网站,它位于堆栈的前面。 关键是CloudFlare除了创建新的连接之外,还保留空闲连接,这不是我可以更改的设置。 当我让Varnish或Nginx坐在前面监听端口80时,它们具有开箱即用的配置来挂断空闲连接。 很好,直到我必须将用Go编写的代理添加到堆栈的最前面。它使用标准库。 我不是Go向导,而是根据人们告诉我的内容,只有读写超时设置,而不

  • 我需要做一个50个座位的公交车预订系统,只使用编程的基本知识。注意:我不能使用数组或字符串,所以我声明了50个布尔变量,以了解座位是否已经预订。这里的问题是:我不知道如何将用户输入的数字与布尔座位变量相关联 例如:如果用户输入数字'17',更改'seat17'值为false有人能帮我吗?

  • 问题内容: 我有一个酒店预订系统的查询,当有特定房间时,我需要查找日期。(这是一家精品酒店,人们在其中预订特定的房间,因此在获得此代码之前,他们知道他们想要的确切房间。 我要查找的结果是一个房间的详细信息,我在查询中指定了一个房间-我是不查找多个房间的信息。 ) “可用性”表模式很简单,每一行是: 因此,例如,如果某个房间在1月1日至1月5日期间被占用,则将五行添加到可用性表中,每一天占据该房间。

  • 我现在正在做一个结果表,我想排序一个表,按点(顶部最高),如果点相等,我想按目标差异排序,然后如果目标差异相等,我想按目标排序得分了。 所以一张桌子可能看起来像这样, 所以A队赢得联赛是因为它比B队有更好的进球差距,C队比D队得分更高,因为他们进了更多的球,其他一切都是平等的。 可以在mysql中以这种方式排序吗,或者我需要用PHP解析结果吗?