【问题标题】:Dynamodb range query on time stampDynamodb 范围查询时间戳
【发布时间】:2020-05-13 21:40:48
【问题描述】:

我有一个具有以下结构的 dynamodb 表

userId -> hashkey
timestamp -> sortkey
//other fields

我想在这个表上执行两个主要查询。

  1. 获取用户的所有条目 -> 这很简单,因为我可以对 hashkey 进行查询
  2. 获取最近的 N 个条目 -> 不确定执行此操作的最佳方法是什么。我将在 UI 中显示这些,所以我需要进行分页。我应该使用扫描吗?还是在时间戳上创建 GSI 并使用查询?

还有其他建议吗?谢谢。

2014 年 5 月更新 这里有很多很好的建议。我仍在试图弄清楚如何最好地实现这一点,并想检查以下方法的优缺点。

Trips: 
  Id -> this is a GUID generated by the API that is inserting data to dynamo
  timestamp -> sortkey
  //other details

UserTrips:
  userId -> hashkey
  tripId -> id from trips table

RecentTrips:
  timeKey -> YYYYMM format hash key
  tripId -> id from trips table

我担心这可能会造成很多不一致,就好像插入到用户行程或最近行程失败等。

【问题讨论】:

  • 典型的解决方案是一个 GSI,其中 YYMMDD 作为分区键,时间戳作为排序键,然后您可以使用查询,但只能在给定的一天内使用。示例:stackoverflow.com/questions/35963243/…
  • 我需要最近创建的N条记录,不应该受日期限制。
  • 一般来说,您不能使用 NoSQL 数据库执行此操作。您可以设置分区键 YYYYMM 并获取当月最新的 N 条记录,但在新月第一天的凌晨它无法正常工作(您必须对最新的 N 条进行两次查询月和上个月的最新 N,并汇总结果 - 不难做到,但有点痛苦。另一种选择是在辅助表中保留某种索引,以指向通过 DynamoDB Streams 触发器维护的最新记录。

标签: amazon-web-services amazon-dynamodb dynamodb-queries


【解决方案1】:

您没有指定您使用的是哪个 aws sdk,但例如在 Java 中,您可以通过查询哈希键来解决数字 2,范围键条件是它的值小于您加载的最后一个项目的值.您还必须指定降序,因为 ddb 查询默认为升序。为了进行分页,您只需对查询进行限制,以获得您指定的最大项目数。

所以你基本上:

  • 将 lastLoadedItemTimestamp 设置为当前时间戳
  • 使用哈希键 A 查询 10 个项目,条件是范围键(即时间戳)小于 lastLoadedItemTimestamp
  • 将 lastLoadedItemTimestamp 设置为最后加载项的范围键
  • 如果查询返回 10 项,则重复上述两个步骤,循环直到查询返回少于 10 项

【讨论】:

  • 最近的 N 次查询几乎可以肯定不是“给我用户 ID X 的最后 N 条记录”。它是“给我所有用户的最后 N 条记录”。
  • @jarmod 你是对的,所有用户都需要它
  • @user1868744 哦,对不起,我以某种方式假设您需要用户的最后 N 个条目,因为问题基本上是:“我知道如何获取用户的所有条目,但如何获取最后 N时间戳条目”
【解决方案2】:

我昨天回答了有关此主题的类似问题,因此将我的答案链接在这里以防万一有用:https://stackoverflow.com/a/61783992/11986130

简而言之,我决定使用year 作为我的分区键,这样我就可以使用查询(如果我有很多数据,也许一个月或其他时间当然会更合适)。

希望对你有帮助!

编辑:这种方法不一定没有问题,因为您可能会因“热分区”而降低性能 - 也可能值得看看这个答案:https://stackoverflow.com/a/36491475/11986130

【讨论】:

猜你喜欢
  • 2020-04-21
  • 1970-01-01
  • 2013-10-22
  • 2020-05-05
  • 2012-12-09
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多