如何对有关重叠时间范围的谷歌应用引擎数据存储进行最佳查询



我对开始和结束有一些保留(删除了对资源的引用以使示例更清晰):

class Reservation(db.Model):
  fromHour = db.DateTimeProperty()
  toHour = db.DateTimeProperty()
  fromToRange = db.ComputedProperty(lambda x: [x.fromHour, x.toHour])

并希望添加另一个保留,并检查它是否与前一个预订重叠 - 如何在Google App Engine中表达此类查询。

首先,我尝试使用列表属性进行此查询,但双重不等式过滤器不起作用。它应该从 1 <到 _x0032_=" 和=" from1=">= from2 进行两次匹配,还有一个结果 - 如果有更多的数据,它可能会很昂贵。

fromHour = datetime.datetime(2012, 04, 18, 0, 0, 0)
toHour = datetime.datetime(2012, 04, 18, 2, 0, 0)
reservation = Reservation(fromHour = fromHour, toHour = toHour, colors = ['white', 'black'])
reservation.put()
self.response.out.write('<p>Both %s</p>' % fromHour)    
self.response.out.write('<ol>')    
for reservation in Reservation.all()
  .filter('fromToRange >', fromHour)
  .filter('fromToRange <=', fromHour):
  self.response.out.write('<li>%s</li>' % (reservation.fromToRange))
self.response.out.write('</ol>')

找到了另一种解决方案,我可以使用包含天数的额外属性(这将是每个预订范围内的天数列表),而不是我可以点击需要检查天数以缩小数据扫描范围,如果不重叠新预订,则检查每条记录。

请帮助并提供一些答案,如何进行最佳查询以检测重叠的预订 - 也许Google App Engine中的时间范围查询有快速的第三种解决方案,或者不受支持。

是的,多个不等式过滤器对查询的限制使得某些事情非常困难/次优。例如地理搜索。

我会选择您提出的解决方案:量化属性值并将所有量化值保存在列表属性中,例如,将持续时间跨度包含在内的所有天数保存到列表属性中。棘手的部分是选择正确的量化水平:天、小时等。

就我个人而言,我会从通用时间尺度开始:Unix 时间(纪元),然后将其四舍五入到秒,然后对其进行十进量化。例如,从中切下三个零(1000 秒量化器,跨度 ~ 16 分钟),并将从开始时间到结束时间的所有量化值保存在列表中。

如果量化器

太细,则使用更大的量化器:10000秒。

然后,只需使用相等筛选器查询列表属性,并在内存中另外筛选结果,以考虑确切的持续时间开始和结束时间。

最新更新