【数据建模】设计一个DynamoDB数据模型,用于管理图形化的层次关系 -- 查询分层数据

视频号

微信公众号

知识星球

Chinese, Simplified

您已经定义了访问模式,并设计了一个DynamoDB数据模型来实现访问模式。现在,您可以在DynamoDB数据库中查询分层数据。作为节省成本和确保性能的最佳实践,以下示例仅使用查询操作而不使用SCAN。

如何查找组件的祖先

要查找CM8组件的祖先(父母、祖父母、曾祖父母等),请使用ComponentId=“CM8”查询基表。查询将返回以下记录。

ComponentId

ParentId

GraphId

Path

CM8

CM4

CM1#1

CM1|CM2|CM4|CM8

若要减小结果数据的大小,可以使用投影表达式仅返回Path属性。

Path

CM1|CM2|CM4|CM8

现在,使用管道(“|”)分割路径,并获取第一个N-1组件以获取祖先。

查询结果:CM8的祖先是CM1、CM2、CM4。

如何查找组件的直接子级

要获取给定组件CM2的所有直接子级或下游一级组件,请使用ParentId=“CM2”查询GSI1。查询将返回以下记录。

ParentId

ComponentId

CM2

CM4

CM5

查询结果: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

查询结果:CM1的所有下游组件均为CM2、CM3、CM4、CM5、CM8、CM9、CM10、CM6和CM7。

如何使用中级组件查找所有下游子组件

要递归获取给定组件CM2的所有子组件或下游组件,您有两个选项。您可以逐层递归查询,也可以查询GSI2索引。

选项1

逐级递归地查询GSI1,直到到达子组件的最后一级。

1.使用ParentId=“CM2”查询GSI1。它将返回以下记录。

ParentId

ComponentId

CM2

CM4

CM5

2.再次使用ParentId=“CM4”查询GSI1。它将返回以下记录。

ParentId

ComponentId

CM4

CM8

CM9

3.再次使用ParentId=“CM5”查询GSI1。它将返回以下记录。

ParentId

ComponentId

CM5

CM10

继续循环:查询每个ComponentId,直到达到最后一级。当使用ParentId=“<ComponentId>”的查询不返回任何结果时,上一个结果来自树的最后一级。

4.合并所有结果。结果=[CM4,CM5]+[CM8,CM9]+[CM10]=[CM4、CM5、CM8、CM9、CM10]

查询结果:CM2的所有下游组件均为CM4、CM5、CM8、CM9和CM10。

选项2

查询GSI2,它存储顶级组件(汽车或CM1)的分层树。

1.首先,找到CM2的顶级组件或顶级祖先和路径。为此,使用ComponentId=“CM2”查询基表,以在层次树中查找该组件的路径。选择GraphId和Path属性。查询将返回以下记录。

GraphId

Path

CM1#1

CM1|CM2

2.使用GraphId=“CM1#1”AND BEGINS_WITH(“Path”,“CM1|CM2|”)查询GSI2。查询将返回以下结果。

GraphId

Path

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

3.选择ComponentId属性以返回CM2的所有子组件。

查询结果:CM2的所有子组件均为CM4、CM5、CM8、CM9和CM10。

本文地址
https://architect.pub/design-dynamodb-data-model-managing-graphlike-hierarchical-relationship-querying-hierarchical-data
SEO Title
Design a DynamoDB data model for managing a graphlike hierarchical relationship -- Querying hierarchical data