私は木のような構造を持っています
(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が与えられると、すべてのMが返されます
4-Tが与えられると、関係とともにすべてのMと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
Children / Parent / Siblingの関係に挿入するために、AppendSet(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html)を使用することを考えていました。
このアプローチでは、ほとんどのクエリが可能ですが、たとえばDDBを2回呼び出す必要がある場合があります。たとえば、Tが与えられたすべての子のリストを取得する場合、つまりTの場合はM1、M2、M3、M4を取得します。次に、M1、M2、M3、M4のバッチ取得を実行します。
ただし、このアプローチの問題は私のプットです。データベースに挿入するときは、複数の行で更新する必要があります。また、私はおそらく素晴らしいとは言えないかもしれないインデックスを使用していません。私はこれに間違った方法でアプローチしていますか?
これは、1GSIを使用して解決できます。あなたは次のようにテーブルを持つことができます
| 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クエリに移植できます)
*ここでlevel = xを選択します
Node = xであるParentを選択します
スキャンみたい?
スキャンみたい?
*ここでlevel = xを選択します
選択*ここで(レベル)=(レベル)m1 +1 if you need all children
*を選択します。ここで(レベル)=(レベル)m1 +1で、親はM1で始まります if you need all children of M1
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加