首页 > 解决方案 > 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并更新 Book 所在的所有书籍SK=author_PK

我正在尝试使用AWS-SDKfor node解决这个问题js

标签: amazon-web-servicesnosqlamazon-dynamodb

解决方案


复制数据是在 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);

推荐阅读