【发布时间】: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