Когда инициализация нового бэкенда 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 специально указывает, что комментарии блога должны помещаться в отдельную таблицу в производственной среде.
Это противоречит рекомендациям, изложенным в Документация DynamoDB:
You should maintain as few tables as possible in a DynamoDB application. Most well designed applications require only one table.
Действительно ли при использовании AppSync каждый тип принадлежит отдельной таблице DynamoDB?





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 в одном клиентском запросе с помощью дизайн схемы, вложенные преобразователи или даже реализации Конвейерные преобразователи.
(этот ответ был отредактирован с помощью Ричард)