第 6 步:创建数据查询
定义访问模式并设计数据模型后,可以在 DynamoDB 数据库中查询层次数据。作为节省成本和确保性能的最佳实践,以下示例仅使用无 Scan 的查询操作。
-
(查找组件的原级。)
要查找 CM8 组件的原级(父级、祖父级、曾祖父级等),请使用
ComponentId = "CM8"查询基表。查询将返回以下记录。要减小结果数据的大小,您可以使用投影表达式仅返回
Path属性。ComponentId
ParentId
GraphId
路径:
CM8
CM4
CM1 #1
CM1|CM2|CM4|CM8
路径:
CM1|CM2|CM4|CM8
现在,使用管道("|")分割路径,然后取前 N-1 个组件来获取原级。
查询结果:CM8 的原级是 CM1、CM2、CM4。
-
(查找组件的直接子组件。)
要获取组件 CM2 的所有直接子组件或下游一级组件,请使用
ParentId = "CM2"查询 GSI1。查询将返回以下记录。ParentId
ComponentId
CM2
CM4
CM5
-
使用顶部组件查找所有下游子组件。
要获取顶部组件 CM1 的所有子组件或下游组件,请使用
GraphId = "CM1#1"和begins_with("Path", "CM1|")查询 GSI2,并使用带ComponentId的投影表达式。它将返回与该树相关的所有组件。本例中有一个树,CM1 作为顶部组件。实际上,同一个表中可能有数百万个顶部组件。
GraphId
ComponentId
CM1 #1
CM2
CM3
CM4
CM5
CM8
CM9
CM10
CM6
CM7
-
使用中间组件查找所有下游子组件。
要递归获取组件 CM2 的所有子组件或下游组件,您有两个选择。您可以逐级递归查询,也可以查询 GSI2 索引。
-
逐级递归查询 GSI1,直至到达子组件的最后一级。
-
使用
ParentId = "CM2"查询 GSI1。这将返回以下记录。ParentId
ComponentId
CM2
CM4
CM5
-
同样,使用
ParentId = "CM4"查询 GSI1。这将返回以下记录。ParentId
ComponentId
CM4
CM8
CM9
-
同样,使用
ParentId = "CM5"查询 GSI1。这将返回以下记录。继续循环:查询每个
ComponentId,直至到达最后一级。当使用ParentId = "<ComponentId>"查询未返回任何结果时,上一个结果来自树的最后一级。ParentId
ComponentId
CM5
CM10
-
合并所有结果。
result=[CM4, CM5] + [CM8, CM9] + [CM10]
=[CM4, CM5, CM8, CM9, CM10]
-
-
查询 GSI2,它存储顶部组件(汽车或 CM1)的层次树。
-
首先,找到 CM2 的顶部组件或顶部原级和
Path。为此,使用ComponentId = "CM2"查询基表,在层次树中找到该组件的路径。选择GraphId和Path 属性。查询将返回以下记录。GraphId
路径:
CM1 #1
CM1|CM2
-
使用
GraphId = "CM1#1" AND BEGINS_WITH("Path", "CM1|CM2|")查询 GSI2。查询将返回以下结果。GraphId
路径:
ComponentId
CM1 #1
CM1|CM2|CM4
CM1|CM2|CM5
CM1|CM2|CM4|CM8
CM1|CM2|CM4|CM9
CM1|CM2|CM5|CM10
CM4
CM5
CM8
CM9
CM10
-
选择
ComponentId属性以返回 CM2 的所有子组件。
-
-