Dynamodb обновляет несколько данных

#amazon-web-services #nosql #amazon-dynamodb

#amazon-web-services #nosql #amazon-dynamodb

Вопрос:

Предположим, это моя таблица БД

 [
{PK:'#author_1', SK: 'author', name: 'aytor'},
{PK:'#author_2', SK: 'author', name: 'ryan'},
{PK:'#book_1', SK: '#author_1', title: 'hello 123', author_name: 'aytor'},
{PK:'#book_2', SK: '#author_1', title: 'hello 456', author_name: 'aytor'},
{PK:'#book_3', SK: '#author_1', title: 'hello 789', author_name: 'aytor'},
 ]
 

Мой вопрос в том, если администратор изменит имя автора, как я могу обновить имя автора всех книг.

Шаблон доступа: получить author_pk и обновить все книги, в которых книга SK=author_PK

Я пытаюсь решить эту проблему, используя AWS-SDK for node js

Ответ №1:

Дублирование данных — прекрасный способ моделирования отношений «один ко многим» в DynamoDB. Однако это может быть менее привлекательной стратегией, если данные, которые вы дублируете, могут быть изменены. Если это нечастая операция, например, обновление автора книги, это может быть приемлемым подходом.

С помощью этой модели данных вам нужно будет извлекать все книги по авторам и вручную обновлять имя автора каждой книги. Вы можете либо scan создать таблицу для всех книг этого автора, либо ввести глобальный вторичный индекс для элементов книг, где индекс PK = author_id и SK = book_id. Таким образом, вы сможете query просматривать список книг для каждого автора и выпускать соответствующие обновления.

DynamoDB не предлагает операцию пакетного обновления. Однако вы можете справиться с параллелизмом в своем приложении. С помощью was node SDK это выглядело бы примерно так (в псевдокоде, я это не тестировал)

 
    const updates = [];
    let new_author_name = "Clancy"
    for (let i = 0; i < books.size; i  ) {
        updates.push(ddb.update({
            TableName: 'MY_TABLE',
            Key: { PK: books[i].PK},
            UpdateExpression: 'SET #name = :name',
            ExpressionAttributeValues: {
                ':name': new_author_name
            },
            ExpressionAttributeNames: {
                '#name': 'name'
            }
        }).promise());
    }

    await Promise.all(updates);
 

Комментарии:

1. можете ли вы предложить мне модель или подход для эффективного обновления данных книги при каждом обновлении данных автора. Я использую GSI для извлечения данных книги, но я не понимаю, как я могу обновлять несколько данных книги одновременно при изменении автора.

2. Я добавил пример выдачи нескольких вызовов updateItem с использованием node (не тестировался). Поскольку AWS не включает в себя операцию пакетного обновления API, вы должны справиться с этим самостоятельно.

Ответ №2:

Ответ, который дал @seth-geoghegan, верен для имеющихся у вас данных. Однако мне интересно, не захотите ли вы изменить свои данные, чтобы сделать это немного проще. Вместо book того, чтобы быть PK для записей книги, почему бы не сделать это author ? Вам все равно может потребоваться добавить GSI, если вам нужно перейти к книге по ее идентификатору, но это будет в query любом случае (в настоящее время у вас есть book as the PK и author as the SK , что означает, что вы не можете получить доступ к одной книге, используя a get , не зная автора).

 [
{PK:'#author_1', SK: 'author', name: 'aytor'},
{PK:'#author_1', SK:'#book_1', title: 'hello 123', author_name: 'aytor'},
{PK:'#author_1', SK:'#book_2', title: 'hello 456', author_name: 'aytor'},
{PK:'#author_1', SK:'#book_3', title: 'hello 789', author_name: 'aytor'},
{PK:'#author_2', SK: 'author', name: 'ryan'},
 ]
 

Это позволит вам запрашивать все записи для автора и обновлять имя автора.

Если вам все еще нужно запросить книгу по ее идентификатору, просто добавьте для этого GSI.

 [
{PK:'#author_1', SK: 'author', name: 'aytor'},
{PK:'#author_1', SK:'#book_1', title: 'hello 123', author_name: 'aytor', GSI1PK: '#book_1'},
{PK:'#author_1', SK:'#book_2', title: 'hello 456', author_name: 'aytor', GSI1PK: '#book_2'},
{PK:'#author_1', SK:'#book_3', title: 'hello 789', author_name: 'aytor', GSI1PK: '#book_3'},
{PK:'#author_2', SK: 'author', name: 'ryan'},
 ]
 

Комментарии:

1. Это действительно полезно, теперь я могу извлекать книги без author PK. Но все же я не понимаю, как я могу обновлять повторяющиеся данные (данные автора в книгах) сразу или эффективно при обновлении автора.

2. На этот вопрос нет простого ответа, поэтому обычно требуется ограничить дублируемые данные неизменяемыми (или в основном неизменяемыми) данными или ограничить количество их дублирования. Когда я делаю это, я обычно использую потоки DynamoDB; обновите основную запись, и в обработчике потока lambda я найду другие записи, которые необходимо обновить, и обновлю их в этом коде.