AWS Amplify — AppSync и несколько таблиц DynamoDB

Когда инициализация нового бэкенда GraphQL через интерфейс командной строки 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 поощряет использование нескольких таблиц. Например, Примечание на снимке экрана ниже из документации AWS AppSync специально указывает, что комментарии блога должны помещаться в отдельную таблицу в производственной среде.

AWS Amplify — AppSync и несколько таблиц DynamoDB

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
25
0
6 266
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

Ответ принят как подходящий

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

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

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

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

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

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

Другие вопросы по теме