gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:51:29 25 4
gpt4 key购买 nike

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

  1. Is it possible to save datetime to DynamoDB?

My Question is does the mechanics of the DynamoDB string comparison 'BETWEEN' that enables the above functionality ALSO allow you to query TWO date objects stitched together (example: 2018-05-01-2018-05-10) as a single Sort Key where the first stitched date is ALWAYS before the second stitched date.

After initial testing it APPEARS that the answer is YES, so long as your BETWEEN query also has two concatenated dates this should be possible.

I am hoping someone can help me figure out whether this would be safe / stable to deploy.

在我们进入背景之前,我想我应该在这里发布我的测试用例,以明确我的要求。

给定排序键:2018-05-01-2018-05-25

  1. 2018-05-01-2018-05-20 和 2018-05-01-2018-05-26 之间的查询(RETURNS 项)
  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 之间的查询(RETURNS 项)
  4. 2018-05-02-2018-05-20 和 2018-05-02-2018-05-26 之间的查询(未找到数据)
<小时/>

背景

<小时/>

我正在构建一个可查询的 DynamoDB 航类组合表,我希望查询能够检查出发航类日期是否在特定日期之后,以及回程航类是否在特定日期之前。

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

排序键值的表示形式为...

  • 出发日期1-返回日期2
  • 年-月-日-年-月-日

我正在预先检查数据,以便出发航类(第一个串联日期)可以被假定为始终在返回航类(第二个串联日期)之前(如果它在我们的表中),因此考虑到 BETWEEN 操作,我的假设是这应该是可能的。

I will post back after more testing but I am hoping someone has more experience with exactly how (and why) the DynamoDB BETWEEN Query function works in this case.

最佳答案

发布此答案是因为我在生产中使用上述内容已经有一段时间了。

简短回答:

Sort of, depending on your goals. You can chain multiple ISO 8061 dates in a Sort Key on DynamoDB and use the Between function — however the second date will still need to be run through a Filter to ensure perfect adherence.

更长的答案和示例

如果您的目标是使用复合排序键首先减少返回的记录数量,然后对其进行过滤 - 那么就可以了。它实现了限制需要过滤的记录数量的目标(因为在许多情况下,Sort Key BETWEEN 查询实际上会过滤掉不匹配的垃圾)。

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

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

我们的目标是仅返回开始日期(在本例中为 2018-09-01)和结束日期(在上例中为 2018-09-07)均在我们的查询之间的界限。

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

2018-08-15_2018-09-07 和 2018-09-05_2018-09-08 之间

起初,查询似乎有效(正如我原来的问题中提到的),因为上面确实返回了示例数据。 问题是情况并非总是如此。

破坏示例排序键

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

2018-09-04_2018-09-15

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

这是因为 DynamoDB 如何看待查询之间...

逻辑之间的 DynamoDB 注释

DynamoDB 基本上将 ISO 8061 日期视为同一日期的数字表示形式(不带破折号)。所以 2018-09-01 = 20180901。由于 ISO 8061 日期从最大到最小级联,其中两个一起看起来(对于 Dynamo)如下所示:2018090120180907。

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

还有用吗?

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

You just have to plan to ALSO run a Filter against your returned Query data to ensure that all dates are within bounds.

关于database-design - 由两个 ISO 8061 日期组成的复合排序键的 DynamoDB 查询是否返回正确的结果(使用 BETWEEN)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50032186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com