【问题标题】:How to setup Amplify Datastore schema for single table design如何为单表设计设置 Amplify Datastore 架构
【发布时间】:2022-01-06 01:23:04
【问题描述】:

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

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

大多数在线资源表明,为了充分利用 DynamoDB,单表设计方法是可行的方法。这意味着我们可以使用documentation 中所示的结构,添加排序键来进行额外的查询。

Datastore 文档说应该使用 @model 指令来设置所有突变、查询和订阅。为了建立项目和位置之间的关系,我们应该使用@manyToMany 指令,如here 所述。所有这些将导致以下架构:

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")
        ...
    }

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

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

【问题讨论】:

    标签: amazon-web-services graphql amazon-dynamodb aws-amplify aws-appsync


    【解决方案1】:

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

    您说得对,术语可能会令人困惑。这里有一些澄清:

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

    数据存储不是约束。 Amplify js client,包括客户端 DataStore 离线同步魔法直接与 AppSync 一起工作。您可以自己构建 DynamoDB 和 AppSync 资源(无需 Amplify 的后端抽象)和still use DataStore in the client

    大多数在线资源表明,为了充分利用 DynamoDB,单表设计方法是可行的方法。

    通常,并非总是如此。单表设计可以为许多用例带来效率回报,是一个可靠的默认选择。不过也有cases in which the pattern is less helpful

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

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

    如何将 Datastore 连接到现有 DynamoDB,因为 Datastore 依赖于 @model 指令

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

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

    总而言之,您可以在 Amplify 后端便利性 + 多张桌子或 DIY 灵活性 + 单张桌子之间做出选择。 DataStore 可以使用任一选项。

    【讨论】:

    • 这很有帮助,谢谢。我们将从使用默认的放大设置开始,并逐步完成,直到我们有一个稳定的产品。将来,如果有必要,我们可能希望将结构更改为单表设计。你知道这是否可行,包括对现有数据进行非规范化?如果是这样,是否有文档或教程/指南演示此过程?
    • 很高兴为您提供帮助。当然,以后的表迁移是可能的。您将使用 DynamoDB SDK 循环遍历旧表条目并在新表中创建新条目。
    猜你喜欢
    • 2011-02-15
    • 2021-02-19
    • 2020-08-30
    • 2013-08-29
    • 2017-05-09
    • 2018-07-04
    • 1970-01-01
    • 2018-06-18
    • 2010-09-28
    相关资源
    最近更新 更多