【问题标题】:DynamoDB - Multiple range keysDynamoDB - 多个范围键
【发布时间】:2020-03-09 08:08:38
【问题描述】:

我们能否在 DynamoDB 中将超过 2 个字段作为主键。

或者我可以为每个我想成为范围键的字段创建本地二级索引并同时使用多个范围键构建查询吗?

【问题讨论】:

  • 第一个问题的简单答案是否定的,但可以在文档中轻松找到该答案。一个更具体的问题,您希望完成的一些背景知识将使您更容易回答您的问题。
  • 我有三个字段 - A(ID) , B(TimeStamp), C(Type- Read, Unread) : Primary Key is A(partition key) with Sort Key B 我用键条件查询数据表达式 - A & B 和 FilterExpression - C 并使用 ScanIndexForward,并且能够对字段 B 上的数据进行排序,但即使在对 C="Unread" 应用过滤器之后,它也会扫描该 ID 的所有记录。然后使用排序键 C 创建二级索引 A(分区键)并使用带有 KeyConditionExpression A 和 C 的二级索引,查询仅扫描 C =“未读”但现在我无法在字段 B 上排序的记录,即时间戳。

标签: database nosql amazon-dynamodb serverless


【解决方案1】:

鉴于您所说的具体情况,我相信您需要的是具有综合指数的 GSI。您的表格将如下所示:

Partition Key        GSI Partition          GSI Sort
ID                   ID                     Type+Timestamp

这样,您可以使用如下过滤器表达式查询 GSI:

#pk = :pk AND begins_with(#sk, :type)

您的ExpressionAttributeNames 需要将#pk 映射到ID 字段,并将#sk 映射到复合字段的名称。

您的ExpressionAttributeValues 需要将:type 映射到您正在搜索的值(“已读”或“未读”)。

因为您正在过滤类型(排序键的第一部分),所以排序键的第一部分将始终相同,因此时间戳将用于结果的排序。

【讨论】:

  • 为此 - 我必须插入具有一个附加属性的数据:类型+时间戳,对吧?
  • 谢谢你,杰森
【解决方案2】:

在 DynamoDB 中,您只能将 2 个字段作为主键。如果您想要多个不同的范围键,您可以为每个键创建一个本地二级索引,但您仍然一次只能查询 1 个索引。您也只能在一张桌子上放置 5 个 LSI。

您要建模的数据是什么?您需要支持哪些查询模式?

【讨论】:

  • 我有三个字段 - A(ID) , B(TimeStamp), C(Type- Read, Unread) : Primary Key is A(partition key) with Sort Key B 我用关键条件查询数据表达式 - A & B 和 FilterExpression - C 并使用 ScanIndexForward,并且能够对字段 B 上的数据进行排序,但即使在对 C="Unread" 应用过滤器之后,它也会扫描该 ID 的所有记录。然后使用排序键 C 创建二级索引 A(分区键)并使用带有 KeyConditionExpression A 和 C 的二级索引,查询仅扫描 C =“未读”但现在我无法在字段 B 上排序的记录,即时间戳。
  • 过滤器表达式仅在扫描/查询完成后应用。例如查询 A & B 可以返回 1000 个项目,然后过滤 C 会将这 1000 个限制为 10。
猜你喜欢
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多