Надеюсь, это ответит на все ваши вопросы. Вот пара вводных вещей. Я буду использовать общую таблицу для всех моих примеров. Ключ хеша node_a
и ключ сортировки node_b
. Существует GSI обратного просмотра, где node_b
- это ключ хеша, а node_a
- это ключ сортировки.
1. Может ли атрибут данных быть картой?
Атрибутом данных может быть любой из поддерживаемых типов данных в DynamoDB , включая карту.
2. Должен ли атрибут данных записываться в два места при записи?
Атрибут данных должен быть записан только в одном месте. Для примера даты рождения вы можете сделать одну из следующих записей DynamoDB:
node_a | node_b | data
----------|-----------|---------------
user-1 | user-1 | {"birthdate":"2000-01-01", "firstname": "Bob", ...}
user-1 | birthdate | 2000-01-01
В первой строке мы создали ребро из узла user-1
, которое возвращается на себя. Во втором ряду мы создали ребро от user-1
до birthdate
. В любом случае это хорошо, и лучший выбор зависит от того, как вы будете получать доступ к вашим данным. Если вам нужно найти пользователей с датой рождения в заданном диапазоне, вам следует создать узел birthdate
. Если вам просто нужно просмотреть информацию о пользователе по его идентификатору, вы можете использовать любую стратегию, но обычно первая строка будет более эффективно использовать пропускную способность вашей таблицы.
3. Если я хочу добавить нового человека, родившегося 1980-12-19, должен ли я сначала искать соответствующий узел?
Нет. Просто вставьте одну из строк из примера выше.
Вам нужно искать узел только в том случае, если есть более сложный шаблон доступа, такой как «обновить имя человека, родившегося в 1980-12-19». В этом случае вам потребуется поискать по дате рождения, чтобы получить узел человека, а затем изменить что-то, связанное с узлом человека. Однако этот вариант использования на самом деле является двумя разными операциями. Вы можете перефразировать это предложение как «Найти человека, который родился в 1980-12-19, и обновить имя», что делает эти две операции более очевидными.
4. (А) Как я могу получить все свойства, связанные с узлом?
Предположим, вы хотите найти все ребра для "myNode". Вы запросите основную таблицу с помощью ключевого выражения из node_a="myNode"
и запросите GSI обратного просмотра с ключевым условием node_b="myNode"
. Это эквивалент SELECT * FROM my_table WHERE node_a="myNode" OR node_b="myNode"
.
4. (B) Как получить все свойства, связанные с ребром?
Все свойства ребра хранятся непосредственно в атрибутах ребра, но вы все равно можете столкнуться с ситуацией, когда вы точно не знаете, где находятся данные. Например:
node_a | node_b | data
----------|-----------|---------------
thing-1 | thing-2 | Is the data here?
thing-2 | thing-1 | Or here?
Если вы знаете порядок краевых узлов (т. Е. Какой узел является node_a
и node_b
), тогда вам потребуется только одна операция GetItem
для извлечения данных. Если вы не знаете, в каком порядке находятся узлы, тогда вы можете использовать BatchGetItems
, чтобы найти обе строки в таблице (только одна из строк должна существовать, если вы что-то не делаете особенно сложный с участием ориентированного графа).
5. Как я могу запросить соседние узлы?
Смежные узлы - это просто два узла, у которых есть ребро, соединяющее их. Вы бы использовали тот же запрос, что и 4a, за исключением того, что вместо интереса к атрибуту data
вас интересуют идентификаторы других узлов.
Еще несколько примеров