我有一个像树的结构
(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。当我插入数据库时,我将不得不更新多行。另外,我没有使用任何可能不是很好的索引。我是否以错误的方式处理此问题?
答案 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查询中)
选择*,其中level = x
选择父节点,其中Node = x
像扫描吗?
像扫描吗?
选择*,其中level = x
选择*其中(level)=(level)m1 +1 if you need all children
选择*其中(level)=(level)m1 +1,并且父级以M1 if you need all children of M1
开头