Database DynamoDB-多个范围键

Database DynamoDB-多个范围键,database,nosql,amazon-dynamodb,serverless,Database,Nosql,Amazon Dynamodb,Serverless,在DynamoDB中,可以有两个以上的字段作为主键吗 或者,我是否可以为希望成为范围键的每个字段创建本地二级索引,并同时使用多个范围键构建查询?在DynamoDB中,只能有两个字段作为主键。如果需要多个不同的范围键,可以为每个键创建一个本地二级索引,但一次只能查询一个索引。您也只能在一个表上放置5个LSI 您试图建模的数据是什么?您需要支持哪些查询模式?鉴于您所说的细节,我相信您需要的是带有复合索引的GSI。您的桌子看起来像这样: Partition Key GSI Partiti

在DynamoDB中,可以有两个以上的字段作为主键吗


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

在DynamoDB中,只能有两个字段作为主键。如果需要多个不同的范围键,可以为每个键创建一个本地二级索引,但一次只能查询一个索引。您也只能在一个表上放置5个LSI


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

鉴于您所说的细节,我相信您需要的是带有复合索引的GSI。您的桌子看起来像这样:

Partition Key        GSI Partition          GSI Sort
ID                   ID                     Type+Timestamp
#pk = :pk AND begins_with(#sk, :type)
使用此选项,您可以使用如下筛选器表达式查询GSI:

Partition Key        GSI Partition          GSI Sort
ID                   ID                     Type+Timestamp
#pk = :pk AND begins_with(#sk, :type)
您的
表达式属性名称
需要将
#pk
映射到ID字段,并将
#sk
映射到复合字段的名称

您的
表达式属性值
需要将
:键入
映射到您正在搜索的值(“已读”或“未读”)


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

第一个问题的简单答案是“否”,但可以在文档中轻松找到答案。一个更具体的问题,你希望完成的一些背景知识会使回答你的问题更容易。我有三个字段-A(ID),B(时间戳),C(类型-读取,未读):主键是A(分区键)使用排序键B,我使用键条件表达式-A&B和FilterExpression-C查询数据,并使用ScanIndexForward对字段B上的数据进行排序,但即使在C=“未读”上应用过滤器后,它也会扫描该ID的所有记录。然后使用排序键C创建了二级索引A(分区键),并使用带有KeyConditionExpression A&C的二级索引,查询只扫描C=“未读”的记录,但现在我无法对字段B(即时间戳)进行排序。我有三个字段-A(ID)、B(时间戳)、C(类型-已读、未读):主键是A(分区键)使用排序键B,我使用键条件表达式-A&B和FilterExpression-C查询数据,并使用ScanIndexForward对字段B上的数据进行排序,但即使在C=“未读”上应用过滤器后,它也会扫描该ID的所有记录。然后使用排序键C创建二级索引A(分区键),并使用带有KeyConditionExpression A&C的二级索引,查询只扫描C=“未读”的记录,但现在我无法对字段B(即时间戳)进行排序。只有在扫描/查询完成后,才会应用筛选表达式。例如,查询A&B可以返回1000个项目,然后筛选C将这些1000个项目限制为10个。为此,我必须插入带有一个附加属性的数据:类型+时间戳,对吗?谢谢