对于我的DynamoDB表,我现在有一个如下所示的模式:
分区键-唯一ID,因此每个项目都有一个完全唯一的ID。
排序键-无
属性-包含一些值的JSON
现在,我想添加一个每个项目都需要的新字段,并指示特定区域(例如NA-1、NA-2、JP-1等)和,我希望能够对这个字段进行查询。例如,我可能需要在我的表上执行一个查询,以检索区域NA-1的所有项。
我的问题是,我应该让这个领域成为一种GSI吗?我是DynamoDB新手,所以我一直在网上进行研究,当GSI字段可能只存在于表中的选定项时,使用GSI似乎是首选的,但对于每个条目,我的字段都是必需的,所以我认为使用GSI不是一种选择。
我看到的另一个可能的选择是执行扫描操作并使用筛选器表达式,但据我所见,这是一个代价高昂的操作,因为DynamoDB必须逐个查看整个表,然后再进行筛选。我的表现在不是很大,但将来可能会变得很大,所以我想要一个可伸缩的选项。
TL;DR有什么方法可以在我的表中添加一个强制的regionID字段并对其执行高效的查询吗?我应该考虑哪些好的选择?
发布于 2020-07-25 21:39:40
是啊,枪弹可能不是这里最合适的。也许你能让它成为分区键的一部分?
发布于 2020-07-26 19:00:55
是。在表上执行2次写入。第一行将是您当前正在编写的内容,第二行将以您的区域作为分区键。不要忘记使用事务,因为其中一个写操作可能不会成功。
虽然您可以使用GSI,但您必须认识到它最终是一致的。更新它需要一段时间,如果在编写完后立即查询,您可能会得到不一致的数据。
发布于 2020-08-02 18:46:48
DynamoDB是一个分布式数据存储区,即它不是将数据存储在单个服务器中,而是使用所提供的分区键(PK)进行分区。这意味着您的数据分布在多个服务器上,并带来了这样的限制:您可以一次查询一个分区。
回到你的查询模式,
retrieve all items with the region X
您需要在主表中添加region-id作为属性,并使其成为GSI的一部分。请注意,为了避免冲突,您需要使GSI成为复合SK。
我建议使用#
这样你就可以查询GSI喜欢的内容,
where BEGINS_WITH ('X', SK)此外,如果您的任何条目移动到一个新区域或在某个区域中创建了一个新条目,它将自动反映在GSI和您的查询结果中。
https://stackoverflow.com/questions/63092887
复制相似问题