如何为单个 table 设计设置 Amplify Datastore 架构

How to setup Amplify Datastore schema for single table design

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

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

大多数在线资源都指出,为了充分利用 DynamoDB,单一 table 设计方法是必经之路。这意味着我们可以使用此 documentation 中所示的结构,添加排序键以进行其他查询。

Datastore 文档说@model 指令应该用于设置所有的变更、查询和订阅。为了建立 Items 和 Locations 之间的关系,我们应该使用 @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 tables,我们会发现生成了多个 tables:Item、Location 和 ItemLocation。 @model 指令自动部署一个 table,@manyToMany 指令也是如此。 Dynamodb 文档不使用这些指令,因此应该可以根据给定的要求制作一个 table。我无法找到如何从 Datastore/Amplify 端执行此操作,或者如何将数据存储连接到现有的 DynamoDB,因为数据存储依赖于 @model 指令在本地存储数据(或者这是我怀疑的)。这不符合 DynamoDB 标准,我们想将此设置更改为单个 table 设计。

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

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

您说得对,术语可能会造成混淆。这里有一些澄清:

For my project, I need to be able to query and change my data offline, syncing the changes whenever the connection is restored. Therefore, DynamoDB with Amplify Appsync and Datastore seems like the best option

数据存储不是约束。 Amplify js client, including the client-side DataStore offline-synching magic works directly with AppSync. You can build DynamoDB and AppSync resources yourself (without Amplify's backend abstractions) and still use DataStore in the client.

Most resources online state that in order to take full advantage of DynamoDB, a single table design approach is the way to go.

经常,不总是。单 table 设计可以为许多用例带来效率回报,并且是可靠的默认选择。不过,还有cases in which the pattern is less helpful.

The @model directive automatically deploys a table, as does the @manyToMany directive. Dynamodb documentation does not use these directives, so it should be possible to make a single table from the given requirements

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

how to connect Datastore to an existing DynamoDB as Datastore relies on the @model directive

它通过 AppSync 连接。 DataStore 是一个与 AppSync 配合使用的客户端工具(想想 Apollo Client)。 DataStore 在云端没有实例化。 AppSync 解析器将 DynamoDB 调用到 read/write 数据。

This is not in line with the DynamoDB standard, and we would like to change this setup to a single table design.

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