【问题标题】:Dynamodb update multiple DataDynamodb 更新多个数据
【发布时间】:2021-03-19 17:15:11
【问题描述】:

假设这是我的数据库表

[
{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并更新BookSK=author_PK所在的所有书籍

我正在尝试将AWS-SDK 用于节点js 来解决此问题

【问题讨论】:

    标签: amazon-web-services nosql amazon-dynamodb


    【解决方案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);
    

    【讨论】:

    • 您能否建议我在每次作者数据更新时有效更新图书数据的模型或方法。我正在使用 GSI 检索图书数据,但我不明白如何在作者更改时一次更新多个图书数据。
    • 我添加了一个使用节点多次调用 updateItem 的示例(未测试)。由于 AWS 不包含批量更新 API 操作,因此您必须自己处理。
    【解决方案2】:

    @seth-geoghegan 给出的答案对于您拥有的数据是正确的。但是,我想知道您是否可能想要更改您的数据,以使其更容易一些。为什么不将book 用作书籍记录的PK,而不是author?如果您需要通过其 ID 访问一本书,您可能仍需要添加 GSI,但无论哪种方式,它都是 query(目前您将 book 作为 PKauthor 作为SK,这意味着你不能在不知道作者的情况下使用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'},
     ]
    

    这将允许您查询作者的所有记录并更新作者姓名。

    如果您仍需要通过 ID 查询图书,只需为此添加 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'},
     ]
    

    【讨论】:

    • 真的很有用,现在不用作者PK就可以检索书籍了。但是,我仍然不明白如何在作者更新时立即或有效地更新重复数据(书籍中的作者数据)。
    • 对此没有一个简单的答案,这就是为什么您通常希望将重复数据限制为不可变(或大部分不可变)数据,或限制重复的次数。当我这样做时,我通常会利用 DynamoDB 流;更新主记录并在流处理程序 lambda 中找到需要更新的其他记录并在该代码中更新它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多