我有一个用例,我必须在 dynamoDB 表上查询超过 2 个属性。据我所知,我们只能使用 GSI 在 DDB 表上查询最多 2 个属性(分区键、排序键)。有什么东西可以让我们使用 GSI 查询多个属性(比如 invoiceId、clientId、invoiceStatus)。
1 回答
是的,这是可能的,但是您需要在设计表格时考虑到您想要支持的每种访问模式。
这个话题已经在 re:Invent 上讨论过多次。这是几年前的视频https://youtu.be/HaEPXoXVf2k?t=2102但每年都有类似的话题讨论。
两个主要选项是使用复合键或查询过滤器。
复合键非常强大,可以归结为制作新的“合成”键,只需连接您记录中的其他字段,然后在 GSI 中使用这些字段。
例如,如果您有一个客户,您希望能够获得他们所有的未结发票,但也希望能够获得单独的发票,您可以使用 clientId 作为分区键并将 invoiceStatus 和 invoiceId 连接在一起作为排序键. 然后,您可以使用 begin_with 仅返回某些发票状态。在此示例中,您必须知道 invoiceStatus 和 invoiceId,这不是最好的示例。
复合键模式对于日期也很有用,因为您可以使用大于或小于来搜索某些时间范围。但是,也可以直接获取具有连接的记录。
另一种设计是使用查询过滤器。这效率较低,因为 DynamoDB 必须扫描与分区和排序键匹配的每条记录。但是,过滤器可以应用于任何属性并减少从 DynamoDB 传输到您的应用程序的数据量。当您的主键主要是选择性的时,这很有用,但可能有多个匹配项,并且过滤器可以为您提供其余的方式。
使用 GSI 可以帮助降低成本的另一个方面是只预测您关心的属性。更新记录时,GSI 仅在更新了投影属性之一时才更新。通过保持 GSI 精简,它使之前列出的策略更具成本效益。