Dynamodb 高效查询

Dynamodb query efficiently

我有一个名为“用户”的 Dynamodb table:

主键:UserId(内部唯一生成) 排序键:电子邮件 属性:好友(类型M)--> UserId, Status

因此,对于一条用户记录,它可能如下所示:

用户ID:000001

邮箱:我的名字@domain.com

       Friends
       -------
       UserId: 00008    Status: Active
       UserId: 00010    Status: Active

如果我想查询和更改“朋友”属性中给定 UserId 的状态,但不知道主键的值,更改 table还是查询技术?有人告诉我,不建议对大 tables 使用“扫描”。

非常感谢任何帮助,因为这个 NoSql 对我来说很新。

听起来你想更新用户好友的状态,但你只知道好友的 ID。从您的问题来看,您的数据存储方式如下:

在此 table 中,您已选择将用户与其好友之间的 one-to-many 关系建模为地图。这是对这种 one-to-many 关系建模的有效方法。但是,正如您所发现的那样,这种方法有局限性。

如果您需要做的只是列出用户好友,这可能就足够了。但是,如果您有任何访问模式需要您按 Friends 地图中的项目进行搜索,您会发现该模式相当有限。

解决此问题的一种方法是在项目 collections:

中为用户与好友关系建模

在这个例子中,我将介绍项目 collections,该项目将不止一种类型的关系分组在同一分区键下。 我还分别将分区键和排序键重命名为 PK 和 SK,因为我现在更通用地使用这些字段。我想指出几点:

  • PK = 000001 表示用户项目集合。此集合包含有关用户和用户的友谊的信息。
  • PK = 000001 SK = user1@gmail.com 是用户 item.
  • PK = 000001 SK = FRIEND00002是代表用户000001和000002之间的友谊的项目。
  • 您可以通过执行 PK= 000001 和 SK begins_with FRIEND 的 query 操作来获取用户 000001 的所有好友。

现在我们已经按照这种方式排列了数据,我们可以更轻松地解决您的访问模式。例如,我们可以创建一个二级索引来交换主 table 的 PK 和 SK 字段。这称为“倒排索引”。使用上面的示例,您的二级索引在逻辑上将如下所示。

请记住,这是相同的数据,只是数据的不同视图。

使用此二级索引,您可以执行单个 UpdateItem 操作来更新任何特定友谊的 status