如何使用 GSI 在 DynamoDB 中查询超过 2 个属性?
How to query on more than 2 attributes in DynamoDB using GSI?
我有一个用例,我必须在 dynamoDB table 上查询 2 个以上的属性。据我所知,我们只能使用 GSI 在 DDB table 上查询最多 2 个属性(分区键、排序键)。有没有什么可以让我们使用 GSI 查询多个属性(比如 invoiceId、clientId、invoiceStatus)。
是的,这是可能的,但您在设计 table 时需要考虑要支持的每种访问模式。
此主题已在 re:Invent 上讨论过多次。这是几年前的视频 https://youtu.be/HaEPXoXVf2k?t=2102 但每年都会就此主题进行类似的演讲。
两个主要选项是使用复合键或查询过滤器。
复合键非常强大,归结为创建新的 'synthetic' 键,这些键简单地连接您记录中的其他字段,然后在 GSI 中使用它们。
例如,如果您有一个客户,您希望能够获得他们的所有未结发票,但也希望能够获得单独的发票,您可以使用 clientId 作为分区键并连接 invoiceStatus 和 invoiceId一起作为排序键。然后,您可以使用 begins_with 仅返回特定的发票状态。在此示例中,您必须知道 invoiceStatus 和 invoiceId,因此这不是最佳示例。
复合键模式对于日期也很有用,因为您可以使用大于或小于来搜索特定时间范围。不过也可以直接拼接得到记录
另一种设计是使用查询过滤器。这效率较低,因为 DynamoDB 必须扫描与分区和排序键匹配的每条记录。但是,过滤器可以应用于任何属性并减少从 DynamoDB 传输到您的应用程序的数据量。当您的主键大多是选择性的,但可能有多个匹配项并且过滤器会帮助您完成剩下的操作时,这很有用。
使用 GSI 有助于降低成本的另一个方面是仅投影您关心的属性。更新记录时,仅当其中一个投影属性更新时,GSI 才会更新。通过保持 GSI 瘦身,它使前面列出的策略更具成本效益。
我有一个用例,我必须在 dynamoDB table 上查询 2 个以上的属性。据我所知,我们只能使用 GSI 在 DDB table 上查询最多 2 个属性(分区键、排序键)。有没有什么可以让我们使用 GSI 查询多个属性(比如 invoiceId、clientId、invoiceStatus)。
是的,这是可能的,但您在设计 table 时需要考虑要支持的每种访问模式。
此主题已在 re:Invent 上讨论过多次。这是几年前的视频 https://youtu.be/HaEPXoXVf2k?t=2102 但每年都会就此主题进行类似的演讲。
两个主要选项是使用复合键或查询过滤器。
复合键非常强大,归结为创建新的 'synthetic' 键,这些键简单地连接您记录中的其他字段,然后在 GSI 中使用它们。
例如,如果您有一个客户,您希望能够获得他们的所有未结发票,但也希望能够获得单独的发票,您可以使用 clientId 作为分区键并连接 invoiceStatus 和 invoiceId一起作为排序键。然后,您可以使用 begins_with 仅返回特定的发票状态。在此示例中,您必须知道 invoiceStatus 和 invoiceId,因此这不是最佳示例。
复合键模式对于日期也很有用,因为您可以使用大于或小于来搜索特定时间范围。不过也可以直接拼接得到记录
另一种设计是使用查询过滤器。这效率较低,因为 DynamoDB 必须扫描与分区和排序键匹配的每条记录。但是,过滤器可以应用于任何属性并减少从 DynamoDB 传输到您的应用程序的数据量。当您的主键大多是选择性的,但可能有多个匹配项并且过滤器会帮助您完成剩下的操作时,这很有用。
使用 GSI 有助于降低成本的另一个方面是仅投影您关心的属性。更新记录时,仅当其中一个投影属性更新时,GSI 才会更新。通过保持 GSI 瘦身,它使前面列出的策略更具成本效益。