DynamoDB |如何在不指定分区键的情况下按排序顺序查询所有记录

时间:2019-10-28 09:27:58

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

我正在使用AWS DynamoDB存储Web应用程序的用户会话记录。

每个记录的格式如下:

uuid  timestamp  type

其中

  • uuid是用户ID和分区键
  • timestamp是Unix时间戳和排序键
  • type是“已连接”或“已断开连接”

在我们的管理员仪表板中,我想显示一个表,其中包含最新的XX个会话,而最新的会话在前。

问题::如何使用AWS DynamoDB以排序的顺序并定义了限制来查询全部 sessions

使用Query指定一个partition key

Scan不会按排序顺序返回结果

我所看到的所有解决方案似乎都有些“ hacky”,而且我怀疑我误解了一些东西,因为这种用例一定很常见。

我知道此黑客解决方案

  1. 将变量定义为具有相同值的所有行
  2. 创建二级索引,并将变量设置为分区键,并将时间戳设置为sortkey
  3. 查询该二级索引(现在所有行都具有相同的分区键)

我不是DynamoDB的专家,但是此解决方案似乎是一种破解,并且与DynamoDB架构相反。

1 个答案:

答案 0 :(得分:1)

您有很多选择可以在dynamo中实现此目的,所有这些选择似乎都是很棘手的,因为您的仪表板用例不是dynamoDB的优化之选。

以下是一些选择:

  1. 存储另一个分区键为“ activesessions”的记录。这个 记录包含活动会话的分区键数组。一条dynamo记录可以存储400kb的数据,因此您可以在此一条记录中存储数千个活动会话密钥(并在需要时分页) 你需要更多)。缺点是您必须在添加和删除会话时维护此“ activesessions”记录。

  2. 扫描-您说记录没有排序,但是从dynamo检索后,可以在代码中对它们进行排序。这实际上是dynamo对过滤器表达式所做的:

  

已读取各项之后应用FilterExpression;   过滤过程不会消耗任何额外的读取容量   单位。

扫描的缺点-无法缩放,并且使用大量读取容量。如果您保证总会话数很少(最多几千次),则只会使用此选项。

  1. 您建议的选项将起作用,但是您仍应尝试为记录提供尽可能唯一的密钥。与其仅仅使用相同的分区键来存储它们,不如通过使用诸如“ samevalue-todaysdate”之类的格式使其更具唯一性。这样,您的查询将能够在特定的一天中找到会话,这比在每个会话中进行搜索要快得多。

  2. 请勿使用dynamodb-使用AWS RDS:mySQL,SQL Server等。