DynamoDB由两个ISO 8061日期组成的复合排序键的查询是否返回正确的结果(使用BETWEEN)?

问题描述 投票:3回答:1

在DynamoDB中处理Sort Key Date对象(ISO 8061格式)的共识似乎是使用STRING键类型,其中查询案例将使用BETWEEN比较来查找两个日期之间的结果(也是ISO 8061),请参阅答案:

  1. Is it possible to save datetime to DynamoDB?

我的问题是,启用上述功能的DynamoDB字符串比较'BETWEEN'的机制是否允许您查询拼接在一起的两个日期对象(例如:2018-05-01-2018-05-10)作为单个排序键第一个缝合日期始终在第二个缝合日期之前。

在初始测试后,它显示答案为YES,只要您的BETWEEN查询也有两个连接日期,这应该是可能的。

我希望有人可以帮我弄清楚这是否安全/稳定部署。

在我们进入后台之前,我想我会在这里发布我的测试用例,以明确我的要求。

鉴于排序键:2018-05-01-2018-05-25

  1. 查询2018-05-01-2018-05-20和2018-05-01-2018-05-26(退货项目)
  2. 查询2018-05-01-2018-05-20和2018-05-01-2018-05-24(未找到数据)
  3. 查询2018-05-01-2018-05-20和2018-05-01-2018-05-25(退货项目)
  4. 查询2018-05-02-2018-05-20和2018-05-02-2018-05-26(未找到数据)

背景


我正在构建一个可查询的DynamoDB飞行组合表,我希望查询检查离开的航班日期是否在特定日期之后,以及返回的航班是否在特定日期之前。

基本上我的理解是,由于数字从左到右(年 - 月 - 日)级联的方式,BETWEEN在DynamoDB上的ISO 8061日期查询工作。如果是这种情况,那么将两个日期连接成一个排序键应该是安全的(在我的情况下)。

排序键值的表示将是......

  • departDate1-returnDate2
  • 年 - 月 - 日 - 年 - 月 - 日

我正在预先检查数据,以便假定离开的航班(第一个连锁日期)总是在返回航班(第二个连锁日期)之前,如果它在我们的表格中,那么因此给出了一个BETWEEN操作我的假设是这个应该是有可能。

我会在经过更多测试后回复,但我希望有人在这种情况下确切知道DynamoDB BETWEEN Query函数的工作原理(以及为什么)。

database-design amazon-dynamodb database-schema
1个回答
0
投票

发布这个答案,因为我已经在生产中使用了上述一段时间了。

简答:

根据您的目标排序。您可以在DynamoDB上的排序键中链接多个ISO 8061日期并使用Between功能 - 但是仍然需要通过Filter运行第二个日期以确保完美遵守。

更长时间回答实例

如果你的目标是使用复合排序键首先减少返回的记录数,然后过滤掉那么 - 那就没关系了。它实现了限制过滤所需记录数量的目标(因为在很多情况下,排序键BETWEEN查询实际上会过滤掉不匹配的垃圾)。

但是在所有情况下它都不起作用/返回目标结果。

因此,对于DynamoDB中的示例数据(排序键):2018-09-01_2018-09-07

我们这里的目标是仅返回数据,其中开始日期(在示例的情况下为2018-09-01)和结束日期(在上例的情况下为2018-09-07)在范围内我们之间的查询。

返回上述数据对象的简单示例查询将是:

Between 2018-08-15_2018-09-07 and 2018-09-05_2018-09-08

首先看起来查询有效(如我原来的问题所述),因为上面的DOES返回了示例数据。问题是情况并非总是这样。

Breaking Example Sort Key

上述查询将返回但实际上不符合我们的查询意图的目标开始/结束日期的复合ISO 8061排序关键日期的示例将是:

2018-09-04_2018-09-15

虽然初始开始日期在我们的目标范围内 - 开始日期小于开始日期最大值(2018-09-05)的事实导致结束日期超过我们理想的结束日期最大值 - 因为总数是仍小于我们的最大值。

这是因为DynamoDB在查询之间查看...

关于Logic之间的DynamoDB的注释

DynamoDB基本上将ISO 8061日期视为没有破折号的同一日期的数字表示。所以2018-09-01 = 20180901。由于ISO 8061日期级联从最大到最小两个一起看起来(对Dynamo)像这样:2018090120180907。

一旦删除了彼此匹配的字符,它就会对数值大于/小于进行简单比较。

还有用吗?

因此,如前所述,您确实获得了不希望从Between查询返回的数据,其中适用于连接在一起的两个(或更多)ISO 8061日期的复合排序键。但是,如果你的目标是首先减少返回的记录数量,以便更有效地过滤 - 那么这仍然是一件好事(取决于你的用例)。

您只需计划对返回的查询数据运行过滤器,以确保所有日期都在边界内。

© www.soinside.com 2019 - 2024. All rights reserved.