应用引擎数据存储中的可用性日期范围查询?

Posted

技术标签:

【中文标题】应用引擎数据存储中的可用性日期范围查询?【英文标题】:Availability date range queries in app engine datastore? 【发布时间】:2014-06-12 17:23:22 【问题描述】:

我已经查看了有关此主题的许多其他主题,但到目前为止我还没有找到任何令人满意的答案,所以我想仔细检查它是否真的只是不可行的数据存储。

在数据存储中,我有一组可以在特定时间段内预订的实体,因此它们具有附加的可用性范围。 AvailabilityRange 实体具有开始日期和结束日期,我想找到完全包含所需日期范围的所有 AvailabilityRanges。在 SQL 中,where 子句类似于:

WHERE AvailRange.startDate < :desiredStartDate AND AvailRange.endDate > :desiredEndDate

对于数据存储,这是不可能的,因为您不能在多个属性上使用不等式过滤器。另外,我看到了一些关于将开始日期和结束日期存储在单个多值列表属性中的旧 cmets(因此您将在单个属性上使用不等式过滤器),但这在应用程序引擎中不起作用 - 请参阅 #3博文:http://aleatory.clientsideweb.net/2009/11/28/google-app-engine-datastore-gotchas/.

我还看到了一些建议,例如,将所有可用天数存储在列表属性中,这样您就可以对该列表属性执行直接相等过滤器,但如果您需要,该解决方案实际上不起作用精确到分钟的范围。

因此,现在数据存储似乎无法做到这一点。我目前的解决方案是使用 App Engine Search 服务来存储可用性范围文档(因为搜索服务确实允许多个不等式过滤器),然后将它们映射回数据存储区中的实体。

谁有更好的建议?

【问题讨论】:

你可以使用search api来实现这种查询,或者cloud sql。两者都不是数据存储区。 【参考方案1】:

按照您的建议使用搜索 API。我遇到了同样的多重不等式问题,我也使用了search api来解决它。

【讨论】:

谢谢,很高兴知道有人这样做了。我将首先尝试 Andrei 的方法,如果有问题,我将使用搜索 API 路线。【参考方案2】:

如果您的实体数量相对较少(不是数百万),您可以运行两个仅键查询 - 一个用于开始日期,一个用于结束日期,然后找到结果的交集。仅键查询几乎免费且速度非常快。

如果您的数据存在其他一些限制,您可以使用它们来优化此过程。例如,如果可用性范围有持续时间限制,您可以循环开始日期查询,直到您到达某个实体不再可用的日期,因为开始日期距离所需的结束日期太远了。然后对结束日期查询执行相同操作。

【讨论】:

为什么这比使用搜索 api 更好?不会的。 它会更便宜,而且可能更快。 感谢您的建议 - 对于我的数据集,我认为这会很好,我会在搜索 API 路由之前尝试一下。 打算将此添加到我的上述评论中:虽然我的可用性范围没有有限的范围,但我认为这种方法与“具有可用性'桶'的列表属性”方法相结合可以大大减少您需要相交的两组。例如,对于我的 AvailabilityRange,除了开始/结束日期之外,我还可以有一个“availableWeeks”的列表属性。然后,在我的查询中,我可以将此属性上的相等过滤器添加到所需的周数。可能没有必要,但很高兴知道这是一种选择。 仅密钥查询是免费的,而搜索 API 费用为每 10k 查询 0.50 美元。最重要的是,您需要为每 1GB 文档支付 2 美元用于索引。

以上是关于应用引擎数据存储中的可用性日期范围查询?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL存储引擎 SQL数据导入/导出 操作表记录 查询及匹配条件

获取财政年度查询中的动态日期范围的逻辑

计算日期范围的重叠数量

四MySQL 存储引擎及数据类型

MySQL常用存储引擎比较

MySQL常用存储引擎比较