AWS Amplify - AppSync и несколько таблиц DynamoDB - PullRequest
2 голосов
/ 03 июня 2019

Когда инициализирует новый бэкэнд GraphQL через CLI Amplify , образец схемы определяет несколько типов с аннотацией @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")
}

При нажатии это приводит к созданию нескольких таблиц DynamoDB (по одной на модель). Таким образом, в этом примере создаются три отдельные таблицы DynamoDB (блоги, сообщения и комментарии)

В нашем случае у нас есть модель Users, и у нас будет около двадцати небольших коллекций, связанных с пользователем. Мне неловко управлять двадцатью различными таблицами DynamoDB, когда создается впечатление, что все эти небольшие коллекции принадлежат объекту User в одной таблице.

Из всего, что я читаю, кажется, что AppSync поощряет использование нескольких таблиц. Например, Note на скриншоте ниже из документации AWS AppSync специально призывает к тому, чтобы комментарии блога в производственной среде помещались в отдельную таблицу.

enter image description here

Это противоречит лучшей практике, изложенной в документации DynamoDB :

Вы должны поддерживать как можно меньше таблиц в приложении DynamoDB. Для большинства хорошо разработанных приложений требуется только одна таблица.

Правда ли, что при использовании AppSync каждый тип принадлежит отдельной таблице DynamoDB?

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Как вы упомянули, в документации DynamoDB говорится, что «большинству хорошо разработанных приложений требуется только одна таблица». Это справедливо для многих приложений, когда разработчики с течением времени изучили свои шаблоны доступа к данным, определились с моделью данных и имеют определенные требования к масштабу, которые необходимо оптимизировать. Многие разработчики не имеют такого уровня понимания своего приложения со дня 1 или обязательно одинаковых требований. Кроме того, некоторые из пунктов, упомянутых в презентациях по разработке единой таблицы (например, компромисс между затратами на хранение и вычислениями), могут быть субъективными в зависимости от вашего приложения.

Когда вы создаете новое приложение или не знаете свой шаблон доступа к данным, преимущества использования шаблона проектирования с одной таблицей приводят к уменьшению результатов, а стратегия использования нескольких таблиц гораздо более гибкая.

AWS ampify - это продуманная клиентская среда, предоставляющая разумные настройки по умолчанию для разработчиков с разным уровнем масштабирования и сложности, поэтому она приняла стратегию использования нескольких таблиц при использовании преобразователя @model в его наиболее простой форме. По мере развития ваших требований вы можете дополнять этот дизайн, используя дополнительные функции Transformer, такие как @ key (для создания индексов отдельных таблиц и составных ключей) или даже полнотекстовый поиск и потоковую передачу из DynamoDB с @ поиск .

Мы признаем, что крупномасштабные или зрелые приложения могут выиграть от использования единого стола. Переход от нескольких таблиц к одной таблице, вероятно, является единовременной операцией «слияния», после этапа создания прототипа и после того, как разработчик понял шаблоны доступа к данным. На самом деле не существует подхода «один размер подходит всем», поэтому Amplify GraphQL Transformer предоставляет вам разные уровни гибкости в зависимости от того, в каком месте находится ваше приложение в его развитии.

Как Луис упомянул в другом ответе: AWS AppSync поддерживает любой тип структуры таблицы независимо от шаблона генерации GraphQL Transformer. Даже если у вас есть несколько таблиц, вы можете легко реализовать реляционные шаблоны GraphQL в одном клиентском запросе либо с помощью дизайна схемы , вложенных преобразователей , либо даже с помощью преобразователей конвейера .

(этот ответ был отредактирован с помощью Ричард )

2 голосов
/ 03 июня 2019

Правда ли, что при использовании AppSync каждый тип принадлежит отдельной таблице DynamoDB?

Нет, вы можете использовать одну таблицу для хранения различных типов (или объектов), необходимыхк вашим услугам.Если у вас есть четко определенные шаблоны доступа к данным, которые вы будете использовать в своем сервисе, вы можете использовать только одну таблицу.Тем не менее, этот подход может быть немного негибким, так как вам нужно заранее продумать свои шаблоны доступа, и может быть трудно добавить новые в будущем.

В настоящее время нет способа воспользоваться преимуществами директивы @modelВ Amplify есть такая конфигурация.Вам нужно будет вручную создать таблицу, а затем настроить соответствующие резольверы для каждого типа Appsync для соответствующего запроса / мутирования.

Это хорошая статья, объясняющая подход: От реляционной базы данных к одной DynamoDBстол: пошаговое исследование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...