Amazon dynamodb 为了高效查询,我应该将此字段设置为GSI、常规属性还是其他属性?

Amazon dynamodb 为了高效查询,我应该将此字段设置为GSI、常规属性还是其他属性?,amazon-dynamodb,dynamodb-queries,amazon-dynamodb-index,Amazon Dynamodb,Dynamodb Queries,Amazon Dynamodb Index,对于我的DynamoDB表,我目前有如下模式: 分区键-唯一ID,因此每个项都有一个完全唯一的ID 排序键-无 属性-包含一些值的JSON 现在,我想添加一个新字段,该字段将是每个项目所必需的,并将指示特定区域,例如NA-1、NA-2、JP-1等,我希望能够仅对该字段进行查询。例如,我可能希望对我的表执行查询,以检索区域NA-1的所有项 我的问题是,我是否应该将此字段设置为GSI?我是DynamoDB的新手,所以我一直在网上研究,当该字段可能只出现在表中的选定项目中时,使用GSI似乎是首选,但每

对于我的DynamoDB表,我目前有如下模式:

分区键-唯一ID,因此每个项都有一个完全唯一的ID

排序键-无

属性-包含一些值的JSON

现在,我想添加一个新字段,该字段将是每个项目所必需的,并将指示特定区域,例如NA-1、NA-2、JP-1等,我希望能够仅对该字段进行查询。例如,我可能希望对我的表执行查询,以检索区域NA-1的所有项

我的问题是,我是否应该将此字段设置为GSI?我是DynamoDB的新手,所以我一直在网上研究,当该字段可能只出现在表中的选定项目中时,使用GSI似乎是首选,但每个项目都需要我的字段,因此我认为使用GSI不是一个选项

我看到的另一个可能的选择是执行扫描操作并使用过滤器表达式,但从我看到的情况来看,这是一个代价高昂的操作,因为DynamoDB必须逐部分查看整个表,然后再进行过滤。我的桌子现在不是很大,但将来可能会变得很大,所以我想要一个可扩展的选项


TL;DR有什么方法可以将强制regionID字段添加到表中并对其执行高效查询?我应该考虑哪些好的选择?

是的,GSI可能不是这里的最佳选择。也许你可以把它作为分区键的一部分?

是的。在表上执行2次写入。第一行是您当前正在编写的内容,第二行将您的区域作为分区键。不要忘记使用事务,因为其中一次写入可能不成功


虽然您可以使用GSI,但您必须意识到它最终是一致的。更新它需要一些时间,如果您在写入后很快进行查询,您可能会得到不一致的数据。

DynamoDB是一个分布式数据存储,即它不在单个服务器中存储数据,而是使用提供的分区键PK进行分区。这意味着您的数据分布在多个服务器上,并且带来了一次只能查询单个分区的限制

回到您的查询模式

retrieve all items with the region X
您需要在主表中添加区域id作为属性,并使其成为GSI的一部分。请注意,为了避免冲突,您需要将GSI SK设置为复合SK。 我建议使用

这样你就可以像查询GSI一样

where BEGINS_WITH ('X', SK)

此外,如果您的任何条目移动到一个新区域或在一个区域中创建了一个新条目,它将自动反映在GSI和您的查询结果中

如何在同一个表上有两个单独的分区键?您认为要向表中添加多少记录项,以及每个项的大小?