Lorsque initialisation d'un nouveau backend GraphQL via la Amplify CLI , l'exemple de schéma définit plusieurs types avec l'annotation @model. Par exemple...
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")
}
Lorsqu'elle est poussée, cela se traduit par la création de plusieurs tables DynamoDB (une par modèle). Ainsi, dans cet exemple, trois tables DynamoDB distinctes sont créées (blogs, publications et commentaires)
Dans notre cas, nous avons un modèle Users
et nous allons avoir une vingtaine de petites collections associées à l'utilisateur. Je me sens mal à l'aise d'avoir à gérer vingt tables DynamoDB différentes quand on a l'impression que ces petites collections appartiennent toutes à l'objet User dans une seule table.
D'après tout ce que je lis, il semble qu'AppSync encourage l'utilisation de plusieurs tables. Par exemple, la note dans la capture d'écran ci-dessous de la documentation AWS AppSync indique spécifiquement que les commentaires du blog doivent être placés dans une table distincte dans un environnement de production.
Cela contredit les meilleures pratiques énoncées dans la documentation DynamoDB :
Vous devez conserver le moins de tables possible dans une application DynamoDB. La plupart des applications bien conçues ne nécessitent qu'une seule table.
Est-il vraiment vrai que lorsque vous utilisez AppSync, chaque type appartient à une table DynamoDB distincte?
Comme vous l'avez mentionné, la documentation DynamoDB suggère que "la plupart des applications bien conçues ne nécessitent qu'une seule table". Cela est valable pour de nombreuses applications lorsque les développeurs ont appris, au fil du temps, leurs modèles d'accès aux données, se sont installés sur un modèle de données et ont certaines exigences d'échelle qui doivent être optimisées. De nombreux développeurs n'ont pas ce niveau de compréhension de leur application dès le premier jour ni nécessairement les mêmes exigences. De plus, certains des points mentionnés dans les présentations sur la conception d'une table unique (par exemple, les compromis entre les coûts de stockage et le calcul) peuvent être subjectifs en fonction de votre application.
Lorsque vous créez une nouvelle application ou ne connaissez pas votre modèle d'accès aux données, les avantages de l'utilisation du modèle de conception de table unique ont des résultats décroissants et la stratégie de plusieurs tables est beaucoup plus flexible.
AWS amplify est un cadre client avisé fournissant des valeurs par défaut sensibles pour les développeurs qui ont différents niveaux d'échelle et de complexité.En tant que tel, il a adopté une stratégie à tables multiples lorsqu'il utilise le transformateur @model dans sa forme la plus élémentaire. Au fur et à mesure que vos besoins évoluent, vous pouvez étendre cette conception en utilisant des fonctionnalités supplémentaires du Transformer telles que @ key (pour créer des index de table unique et des clés composites) ou même la recherche en texte intégral et la diffusion en continu à partir de DynamoDB avec - @ consultable .
Nous reconnaissons que les applications à grande échelle ou matures pourraient bénéficier d'une approche à table unique. Passer de plusieurs tables à une seule table est probablement une opération de "fusion" ponctuelle, après la phase de prototypage et lorsque les modèles d'accès aux données ont été compris par le développeur. En réalité, il n’existe pas d’approche unique, c’est pourquoi Amplified GraphQL Transformer vous offre différents niveaux de flexibilité en fonction de l’évolution de votre application.
Comme Luis l'a mentionné dans une autre réponse: AWS AppSync prend en charge tout type de structure de table indépendamment du modèle de génération GraphQL Transformer. Même si vous disposez de plusieurs tables, vous pouvez facilement implémenter des modèles relationnels GraphQL dans une seule demande client avec conception de schéma , résolveurs imbriqués , ou même implémentant Résolveurs de pipeline .
(cette réponse a été caviardée avec l'aide de Richard )
Est-il vraiment vrai que lorsque vous utilisez AppSync, chaque type appartient à une table DynamoDB distincte?
Non, vous pouvez utiliser une seule table pour stocker différents types (ou entités) requis pour votre service. Tant que vous disposez de schémas d'accès bien définis pour les données que vous utiliserez dans votre service, vous pouvez vous en tirer avec une seule table. Cependant, cette approche peut être un peu rigide car vous devez penser à vos modèles d'accès à l'avance et il peut être difficile d'en ajouter de nouveaux à l'avenir.
Il n'y a actuellement aucun moyen de profiter de la directive @model dans Amplify pour avoir une telle configuration. Vous devrez créer manuellement la table, puis configurer vos résolveurs en conséquence pour chaque type Appsync afin d'interroger/muter en conséquence.
Ceci est un bon article qui explique l'approche: De la base de données relationnelle à la table DynamoDB unique: une exploration étape par étape