如何为单表设计设置 Amplify 数据存储架构

Den*_*ker 4 amazon-web-services amazon-dynamodb graphql aws-appsync aws-amplify

对于我的项目,我需要能够离线查询和更改数据,并在连接恢复时同步更改。因此,具有 Amplify Appsync 和数据存储的 DynamoDB 似乎是最佳选择,但我们正在努力解决一些相互矛盾的建议。

我们的数据是围绕项目构建的,这些项目具有应该实时更改和同步的位置。由于一个位置可以包含多个项目,而一个项目可以有多个位置,因此我们处理多对多关系。我们应该能够查询所有项目、所有位置、单个项目的所有位置、一个位置的所有项目。这是数据结构的基本要求,但我们应该能够添加对上次修改项目等内容的查询。接下来,我们有一个多租户设置,因此应该有一种方法来授权用户访问部分内容数据。我们可能会使用用户组来过滤数据。

大多数在线资源都指出,为了充分利用 DynamoDB,单一表设计方法是最佳选择。这意味着我们可以使用本文档中所示的结构,添加排序键来进行其他查询。

数据存储文档表示,应该使用 @model 指令来设置所有突变、查询和订阅。为了建立 Items 和 Locations 之间的关系,我们应该使用 @manyToMany 指令,如此处所述。总而言之,这将产生以下模式:

type Item 
    @model
    @auth(rules: [{ allow: groups, groupsField: "groups" }])
    {
        ID: ID!
        groups: String!
        locations: [Location] @manyToMany(relationName: "ItemLocation")
        ...
    }

type Location 
    @model
    @auth(rules: [{ allow: groups, groupsField: "groups" }])
    {
        ID: ID!
        groups: String!
        items: [Item] @manyToMany(relationName: "ItemLocation")
        ...
    }
Run Code Online (Sandbox Code Playgroud)

当我们使用 Amplify CLI 部署此架构时,所有资源都会毫无问题地生成。但是,如果我们查看 DynamoDB 表,我们会发现生成了多个表:Item、Location 和 ItemLocation。@model 指令会自动部署表,@manyToMany 指令也是如此。Dynamodb 文档不使用这些指令,因此应该可以根据给定的要求创建单个表。我无法找到如何从数据存储/放大端执行此操作,或如何将数据存储连接到现有的 DynamoDB,因为数据存储依赖 @model 指令在本地存储数据(或者这就是我怀疑的)。这不符合 DynamoDB 标准,我们希望将此设置更改为单表设计。

我一直在查找 Amplify、Datastore 和 DynamoDB 文档以及在线资源,但无法找到任何指导或解决方案。希望有人能把我推向正确的方向,谢谢!

fed*_*nev 5

TL;DR Amplify 的后端工具为您创建 DynamoDB 和 Appsync 样板。这种高级便利是以低级控制为代价的,包括控制应用程序拥有的表数量。

你是对的,术语可能会令人困惑。以下是一些向您澄清的信息:

对于我的项目,我需要能够离线查询和更改数据,并在连接恢复时同步更改。因此,具有 Amplify Appsync 和数据存储的 DynamoDB 似乎是最佳选择

数据存储不是限制。Amplify js 客户端(包括客户端 DataStore 离线同步魔法)可直接与 AppSync 配合使用。您可以自行构建 DynamoDB 和 AppSync 资源(无需 Amplify 的后端抽象),并且仍然在客户端中使用 DataStore

大多数在线资源都指出,为了充分利用 DynamoDB,单一表设计方法是最佳选择。

经常,但并不总是。单表设计可以为许多用例带来效率回报,并且是可靠的默认选择。然而,在某些情况下,该模式的帮助不大

@model 指令会自动部署表,@manyToMany 指令也是如此。Dynamodb 文档不使用这些指令,因此应该可以根据给定的要求创建一个表

仅当您放弃 Amplify 后端而采用 DIY 解决方案时。和指令是 Amplify 后端语法@model@manyToMany提示 Amplify CLI 应如何构建 AppSync 架构和 DynamoDB 表。单表设计使用复杂的复合键结构,这甚至超出了 Amplify 后端 CLI 的强大功能。

如何将数据存储连接到现有 DynamoDB,因为数据存储依赖于 @model 指令

它通过 AppSync 连接。DataStore 是一个与 AppSync 配合使用的客户端工具(例如 Apollo Client)。DataStore 在云中没有实例化。AppSync 解析程序调用 DynamoDB 来读取/写入数据。

这不符合 DynamoDB 标准,我们希望将此设置更改为单表设计。

总之,您的选择是在 Amplify 后端便利性 + 多个表或 DIY 灵活性 + 单表之间进行选择。DataStore 适用于任一选项。