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
。
我有一个名为“用户”的 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
。