在dynamodb中存储树状结构

时间:2019-01-23 07:21:36

标签: 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-给定一个m1L1,则返回所有相同级别的子对象(m1l1,m1l2)

2-给定一个m1L1 id返回TopLevel(T)和M1

3-给定T,则返回所有Ms

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(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html)插入到Child / Parent / Sibling关系中。

使用这种方法,大多数查询是可能的,尽管我可能需要两次调用DDB来进行ex:如果我想获得给定T的所有子代的列表,即对于T,则得到M1,M2,M3,M4 。然后对M1,M2,M3,M4进行批量获取。

但是,这种方法的问题是我的Puts。当我插入数据库时​​,我将不得不更新多行。另外,我没有使用任何可能不是很好的索引。我是否以错误的方式处理此问题?

1 个答案:

答案 0 :(得分:0)

可以使用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

将Node作为主键, GSI的级别,父级分别作为主键和排序键。

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

  1. 选择*,其中level = x

  2. 选择父节点,其中Node = x

  3. 像扫描吗?

  4. 像扫描吗?

  5. 选择*,其中level = x

  6. 选择*其中(level)=(level)m1 +1 if you need all children

选择*其中(level)=(level)m1 +1,并且父级以M1 if you need all children of M1开头

  1. 选择父节点,其中Node = x