AWS Amplify-AppSync和多个DynamoDB表

Kyl*_*avy 8 amazon-web-services amazon-dynamodb graphql aws-appsync aws-amplify

初始化通过扩增出CLI新GraphQL后端,示例模式限定了与@model注释多个类型。例如...

type Blog @model {
  id: ID!
  name: String!
  posts: [Post] @connection(name: "BlogPosts")
}
type Post @model {
  id: ID!
  title: String!
  blog: Blog @connection(name: "BlogPosts")
  comments: [Comment] @connection(name: "PostComments")
}
type Comment @model {
  id: ID!
  content: String
  post: Post @connection(name: "PostComments")
}
Run Code Online (Sandbox Code Playgroud)

推送时,这将导致创建多个DynamoDB表(每个模型一个)。因此,在此示例中,创建了三个单独的DynamoDB表(博客,帖子和评论)

在我们的例子中,我们有一个Users模型,并且将要与用户关联二十个左右的小集合。当这些小型集合都属于一个表中的User对象时,我对于必须管理二十个不同的DynamoDB表感到不安。

From everything I'm reading it seems like AppSync is encouraging the use of multiple tables. For example, the Note in the screenshot below from the AWS AppSync documentation specifically calls out that the blog comments should go into a separate table in a production environment.

在此处输入图片说明

This contradicts the best practice laid out in the DynamoDB documentation:

You should maintain as few tables as possible in a DynamoDB application. Most well designed applications require only one table.

Is it truly the case that when using AppSync each type belongs in a separate DynamoDB table?

Séb*_*acq 7

如您所述,DynamoDB文档建议“设计最完善的应用程序只需要一个表”。当开发人员逐渐了解其数据访问模式,建立在数据模型上并且具有某些需要优化的规模要求时,这对于许多应用程序都是有效的。从第一天开始,许多开发人员就没有对他们的应用程序有这种了解,或者他们的需求不一定相同。另外,关于单表设计的演示中提到的一些要点(例如,存储成本与计算之间的折衷)可能会因您的应用程序而主观。

当您构建新的应用程序或不知道数据访问模式时,使用单表设计模式的好处会减少结果,并且多表策略更加灵活。

AWS Amplify是一个自以为是的客户端框架,可为规模和复杂程度不同的开发人员提供明智的默认设置,因此,在以最基本的形式利用@model转换器时,它已采用了多表策略。随着需求的发展,您可以通过使用Transformer的其他功能(例如@key(用于创建单个表索引和复合键),甚至使用@searchable从DynamoDB进行全文本搜索和流传输)来扩展此设计。

我们确实认识到大型或成熟的应用程序可能会受益于单表方法。在原型开发阶段之后以及开发人员已理解数据访问模式后,从多个表转到单个表可能是一次“合并”操作。实际上,没有一种“万能的方法”,这就是为什么Amplify的GraphQL Transformer可以根据您应用程序的发展情况为您提供不同级别的灵活性。

正如Luis在另一个答案中提到的那样:AWS AppSync确实支持任何类型的表结构,而与GraphQL Transformer生成模式无关。即使您有多个表,也可以使用架构设计嵌套解析器甚至实现管道解析器在单个客户端请求中轻松实现GraphQL关系模式。

(此回复在Richard的帮助下进行了编辑)


小智 5

使用 AppSync 时,每种类型都属于单独的 DynamoDB 表,真的是这样吗?

不,您可以使用单个表来存储您的服务所需的不同类型(或实体)。只要您为将在服务中使用的数据定义了明确的访问模式,您就可以只使用一张表。但是,这种方法可能有点不灵活,因为您必须事先考虑您的访问模式,并且将来可能很难添加新的访问模式。

目前无法利用 Amplify 中的 @model 指令来进行此类配置。您必须手动创建表,然后为每个 Appsync 类型相应地设置解析器以相应地查询/变异。

这是一篇很好的文章,解释了该方法: 从关系数据库到单个 DynamoDB 表:逐步探索