4

对于我的 DynamoDB 表,我目前有这样的架构:

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

排序键 - 无

属性 - 包含一些值的 JSON

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

我的问题是我应该将此字段设为 GSI 吗?我是 DynamoDB 的新手,所以我一直在在线研究,当该字段可能仅存在于表中的选定项目时,似乎首选使用 GSI,但每个项目都需要我的字段,所以我认为使用GSI 不是一种选择。

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

TL;DR 有没有办法可以在我的表中添加一个强制性的 regionID 字段并对其执行有效的查询?我应该考虑哪些好的选择?

4

3 回答 3

1

是的,GSI 可能不适合这里。也许您可以以某种方式使其成为分区键的一部分?

于 2020-07-25T21:39:40.597 回答
0

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

回到您的查询模式,

retrieve all items with the region X

您需要region-id在主表中添加一个属性并使其成为 GSI 的一部分。请注意,为避免冲突,您需要将 GSI SK 设为复合 SK。
我建议使用<region>#<unique-id>

这样您就可以像查询 GSI 一样,

where BEGINS_WITH ('X', SK)

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

于 2020-08-02T18:46:48.473 回答
0

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

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

于 2020-07-26T19:00:55.787 回答