Как обрабатывать вложенные данные моделирования DynamoDB? - PullRequest
0 голосов
/ 09 марта 2020

Я искал этот вопрос, но не смог найти именно то, что искал.

Скажем, у вас есть модель команды:

{
  "partitionKey": "#team",
  "rangeKey": "teamLocation_teamId_...",
  "members": [
    {
      "firstName": "Michael",
      "lastName": "Scott"
    },
    {
        ...
    }
  ]
}

Достаточно просто, я могу найти команда, и это члены. Таким образом, каждый член команды также будет пользователем. В качестве пользователя они будут иметь собственную запись в таблице:

{
  "partitionKey": "emailAddress",
  "rangeKey": "...",
  "firstName": "Michael",
  "lastName": "Scott"
}

Скажем, пользователь меняет свою фамилию. Нужно ли вам найти команду, в которой они находятся, вручную изменить команду, найдя пользователя и обновив фамилию? Способ SQL будет ссылаться на таблицу пользователей внутри команды, поэтому, когда вы получаете команду, вы получаете самую последнюю версию участника.

Наверное, мой вопрос таков: когда вы присоединяете реляционные поля к хранилищу типов документов, как вам лучше всего справляться с обновлениями добавленных вами значений?

1 Ответ

0 голосов
/ 09 марта 2020

Сначала вы должны спросить, действительно ли вам нужны данные с другими объектами. Это не редкость в базе данных № 1016 *, поэтому я предполагаю, что вы делаете. Учитывая это предположение, вам необходимо выяснить, как лучше структурировать ваши данные, чтобы обновления были максимально эффективными. Мой типичный подход к обновлению данных в других строках той же таблицы состоит в том, чтобы использовать потоки DynamoDB и лямбду. Это все еще требует, чтобы у вас был способ найти строки, которые вы хотите обновить, и именно здесь ваша структура хранения может быть не самой лучшей идеей. Вот что я бы порекомендовал для вашего случая. Я собираюсь сделать некоторые предположения для упрощения, надеюсь, вы можете взять это оттуда.

  • Одна строка в таблице для команды. Это включает в себя любую информацию, которую нужно хранить о команде , за исключением участников. Идентификатор команды - это ключ раздела, с некоторым другим фиксированным текстом в качестве ключа сортировки (например, «TeamInfo»).
  • Одна строка в таблице для каждого члена команды. В этой строке должен быть указан идентификатор группы для ключа раздела и идентификатор человека в ключе сортировки.
  • Одна строка в таблице для человека. Эта запись должна включать в себя идентификатор человека и группу, в которой он находится.

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

Когда человек создается / обновляется / удаляется, лямбда-функция, обрабатывающая потоки из таблицы, должна создать / обновить / удалить соответствующую запись для этого человека в команда. Вы можете найти эту запись (для обновлений и удалений), используя идентификатор группы и идентификатор человека.

...