Database design 在dynamodb中存储树状结构

Database design 在dynamodb中存储树状结构,database-design,tree,amazon-dynamodb,Database Design,Tree,Amazon Dynamodb,我有一个树状结构 (T) M1 M2 M3 M4 M1L1 M1L2 M2L1 M3L1 M4L 其中T为顶层,M1、M2、M3、M4为T的子级,M1L1、M1L2为M1的子级,依此类推。树的最大高度为3。可以存在的最大节点数为50k。我想把它存储在数据库中。我希望存储在DynamoDB中,因为我现在所有的基础设施都在DynamoDB中,如果可能的话,我希望将其保存在DynamoDB中 我需要执行以下类型的查询: 1-给定

我有一个树状结构

                (T)
          M1   M2  M3  M4
     M1L1 M1L2 M2L1 M3L1  M4L
其中T为顶层,M1、M2、M3、M4为T的子级,M1L1、M1L2为M1的子级,依此类推。树的最大高度为3。可以存在的最大节点数为50k。我想把它存储在数据库中。我希望存储在DynamoDB中,因为我现在所有的基础设施都在DynamoDB中,如果可能的话,我希望将其保存在DynamoDB中

我需要执行以下类型的查询:

1-给定一个m1L1返回所有相同级别的孩子(m1L1,m1l2)

2-给定m1L1 id返回顶层(T)和M1

3-给定一个T返回所有毫秒

4-给定T返回所有Ms和lowerLevel以及关系

5-给定一个M1返回值,所有水平(M1、m2、m3)

6-给出M1返回所有子项 7-给定M1返回最高液位

我考虑了以下数据库模式:

Primary Key (id of the node)  Children             Parent         Sibling 
T                              M1, M2,M3,M4         null          null
M1                              M1L1,M1L2            T           M2, M3, M4
M2                                  M2L1             T          M1, M3, M4
M1L1                                  null           M1         M1L2
我正在考虑使用AppendSet()插入到子/父/兄弟关系中

通过这种方法,我的大多数查询都是可能的,尽管我可能需要调用DDB两次,例如:如果我想得到给定T的所有子项的列表,即T得到M1、M2、M3、M4。然后对M1、M2、M3、M4进行批处理


然而,这种方法的问题在于我的想法。当我插入数据库时,我必须在多行中更新。此外,我没有使用任何可能不太好的索引。我是否以错误的方式处理此问题?

使用1个GSI可以解决此问题。 你们可以有如下表格

| Node | Level | parent   |
|   T  |   0   |   NOT    |
|   M1 |   1   |   T      |
|   M2 |   1   |   T      | 
|   M3 |   1   |   T      | 
|   M4 |   1   |   T      | 
| M1L1 |   2   |   M1#T   |
| M1L2 |   2   |   M1#T   |
 ... so on

将节点作为主键, 级别,父级分别作为GSI的主键和排序键

下面是您的用例的样子(这些是类似sql的语法,可以从sdk轻松地移植到dynamodb查询)

  • 选择*其中级别=x

  • 选择节点=x的父节点

  • 像扫描一样吗

  • 像扫描一样吗

  • 选择*其中级别=x

  • 如果需要所有子项,请选择*where(level)=(level)m1+1

  • 如果需要m1的所有子项,请选择*其中(级别)=(级别)m1+1,父项以m1开头

  • 选择节点=x的父节点