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