Amazon Web Services ブログ

GraphQL API と AWS AppSync によるシングルテーブルとマルチテーブルの DynamoDB 設計パターン

GraphQL は、API のためのクエリ言語であり、既存のデータを使ってクエリを実行するためのランタイムです。GraphQL は、API 内のデータについて完全で理解しやすい記述を提供し、クライアントが必要なものだけを要求する力を与えます。AWS AppSync はフルマネージドの GraphQL と Pub/Sub API のサービスで、AWS LambdaAmazon AuroraAmazon OpenSearchAmazon DynamoDB などの異なるデータソースに接続する能力をユーザーに提供します。DynamoDB は、あらゆる規模の高性能アプリケーションを実行するために設計された、完全に管理されたサーバーレスでキーバリューの NoSQL データベースです。DynamoDB は、その一貫したパフォーマンス、従量課金モデル、HTTP ベースの接続モデルにより、サーバーレスアプリケーションによく使用されます。DynamoDB と GraphQL を連携させる場合、マルチテーブルとシングルテーブルの 2 つのアプローチがあります。この記事では、これらのアプローチについて簡単にまとめています。

DynamoDB は NoSQL データベースであるため、従来の RDBMS データベースとは異なるデータモデリングパターンを利用する可能性があります。そのようなパターンの 1 つが、1 つの DynamoDB テーブルに複数の異なるタイプのエンティティを含めることであり、これはしばしば “シングルテーブル設計” と呼ばれます。シングルテーブル設計とマルチテーブル設計のどちらが最適か、その答えは本当にあなたのビジネスニーズにかかっています。ここでは、それぞれのメリットとデメリット、そしてその効果について説明します。

マルチテーブル設計

  • より柔軟でわかりやすい (+)
  • シーケンシャルなリクエストのため、レイテンシーが高い (-)

新しいアプリケーションを構築していて、定義されたデータアクセスパターンがまだ定まっていない場合、マルチテーブルを使用した戦略の方がより柔軟性があります。マルチテーブルの設計では、GraphQL スキーマのコアオブジェクトの種類ごとに個別の DynamoDB テーブルが作成されます。これは、各リゾルバーがシーケンシャルなリクエストで一度に 1 つのオブジェクトを取得することにのみ焦点を当てることを意味します。構造的には、これは従来の RDBMS のテーブル構造に似ています。ただし、DynamoDB には、複数のテーブルを組み合わせてクエリを実行する join などの RDBMS の操作は含まれていません。
もし、特定のオブジェクトを他のデータとは別に取得する必要がある場合は、マルチテーブルの設計が適している可能性があります。10 分間のマルチテーブルビデオウォークスルーは How to use multiple DynamoDB tables with GraphQL でご覧いただけます。

シングルテーブル設計

  • 低レイテンシー (+)
  • GraphQL Resolver のロジックがより複雑になる (-)

シングルテーブル設計では、すべてのオブジェクトは 1 つのテーブル内に含まれます。複数のオブジェクトタイプを 1 つのテーブルにまとめることで、関連するアイテムを同じパーティションキーでグループ化し、SQL の join 操作をエミュレートすることができます。このようにして、DynamoDB の一貫したパフォーマンスを得ながら、異なるアイテムを 1 回のリクエストで取得することができます。データアクセスパターンを熟知し、データモデルが決まっていて、最適化すべき規模要件がある場合には最適な選択肢となります。もし、データがほとんど一緒に取得されるようであれば、シングルテーブルの設計が最適な選択肢になるでしょう。10 分間のシングルテーブルのウォークスルービデオは How to use single-table DynamoDB design with GraphQL でご覧いただけます。

シングルテーブルとマルチテーブルの組合せ

これらのデザインは互いに異なっていても、アプリケーションのシンプルさ、柔軟性、レイテンシーを向上させるために組み合わせることは可能です。例えば、多数のエンティティを持つマルチテーブルユーザーの場合を考えてみましょう。彼らは、レイテンシーを減らすために、いくつかの関連するエンティティを複数の単一テーブルにバンドルしたいと思うかもしれません。しかし、前述したように、すべてはデータアクセスパターンがどれだけ周知されているか、そして特定のビジネスニーズにかかっています。

これらの異なるオプションの例と詳細については、How to design an Amazon DynamoDB data model for a GraphQL API のガイドを確認してください。

この記事は Single-table vs multi-table DynamoDB design patterns with GraphQL APIs and AWS AppSync を翻訳したものです。
翻訳は Solutions Architect の 稲田大陸 が担当しました。