Хранение древовидной структуры в DynamodB - PullRequest
0 голосов
/ 23 января 2019

У меня древовидная структура

                (T)
          M1   M2  M3  M4
     M1L1 M1L2 M2L1 M3L1  M4L

где T - верхний уровень, M1, M2, M3, M4 - дочерние элементы T и M1L1, M1L2 - дочерние элементы M1 и так далее. Максимальная высота дерева будет 3. Максимальное количество узлов, которое может быть там, составляет 50 КБ. Я хотел бы сохранить его в базе данных. Я надеюсь сохранить данные в DynamoDB, поскольку вся моя инфраструктура сейчас находится в DynamoDB, и я хотел бы, если возможно, сохранить ее в самой DynamoDB.

Мне нужно будет выполнить следующие типы запросов:

1 - при условии возврата m1L1 всех потомков того же уровня (m1l1, m1l2)

2 - При заданном идентификаторе m1L1 возвращаются TopLevel (T) и M1

3 - если вернуть T, все Ms

4 - при условии T вернуть все Ms и lowerLevel вместе с отношением

5 - при условии возврата M1 все одинакового уровня (м1, м2, м3)

6 - возвращение М1 всем детям 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) для вставки в отношения Дети / Родители / Братья.

При таком подходе большинство моих запросов будут возможны, хотя мне может потребоваться дважды вызвать DDB для ex: если я хочу получить список всех детей, которым дан T, то есть для T получить M1, M2, M3, M4 , Затем сделайте пакетное получение для M1, M2, M3, M4.

Однако проблема с этим подходом - мои путы. Когда я вставляю в базу данных, мне придется обновляться в несколько строк. Также я не использую какие-либо индексы, которые, возможно, не очень хороши. Я неправильно подхожу к этому?

1 Ответ

0 голосов
/ 27 января 2019

Это можно решить с помощью 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-подобный синтаксис и может быть легко перенесен на запросы DynamodB из вашего SDK)

  1. Выберите *, где уровень = x

  2. Выберите Родителя, где Узел = x

  3. Это как сканирование ??

  4. Это как сканирование ??

  5. Выберите *, где уровень = х

  6. Выберите *, где (уровень) = (уровень) m1 +1 if you need all children

Выберите *, где (уровень) = (уровень) m1 +1 и родительский начинается с M1 if you need all children of M1

  1. Выберите Parent, где Node = x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...