[第13回] Amplify & GraphQLでのデータモデル設計

AWS Amplify

 

はじめに

 

皆さん。こんにちは! DreamHanksのエルムです。

今回はAmplify & GraphQLでのデータモデル設計について説明していきます。

前回の記事は[第12回] データ操作です。

 

リレーショナルモデル (Relational models)

 

DataStoreは、has one、has many、 belongs toなど、モデル間の関係を扱う機能を持っています。GraphQLでは、「@connection」と「@key」というディレクティブを使用して、これを行います。

 

DataStoreで@keyディレクティブを使用する場合、名前を指定していれば、どんな値でもフィールドに使用することができます。ただし、nameプロパティが省略された場合、fields配列の最初の項目は “id “でなければなりません。例:@key(fields: [“id”, “content”])

 

スキーマを更新する方法 (Updated schema)

 

以下のDataStoreを使った例では、サンプルスキーマに新しいモデルを追加してみましょう:

 

 

リレーショナルモデルの保存する方法 (Saving relations)

 

接続されたモデルを保存するには、接続したいモデルのインスタンスを作成し、そのIDをDataStore.saveに渡します:

 

Queryingリレーション

 

 

オルタナティブ:

 

リレーショナルモデルの削除する方法 (Deleting relations)

 

one to manyの関係にある親オブジェクトを削除すると、子オブジェクトもDataStoreから削除され、この削除のための変異がネットワーク経由で送信されます。

 

例えば、次のような操作を行うと、id 123のPostとそれに関連するコメントが削除されます:

 

しかし、many to manyの関係では、子供は削除されないので、明示的に削除する必要があります。

 

Many-to-many

上記の例では、one-to-manyスキーマを使用し、接続されたモデルを保存する方法を示しています。また、@connectionの例で示した関係のように、many to manyの関係を定義することもできます。

many-to-manyの関係では、関係の各側からモデルのインスタンスを保存し、@connectionで定義されたフィールドでタイプを接続して結合します。

 

次のようなスキーマを考えてみましょう:

 

 

 

 

これらのmany-to-manyの関係モデルは、直接クエリをかけて、関係にあるすべてのモデルを返すことができます。

 

これにより、PostとEditorのモデルインスタンスが添付されたPostEditorsの配列が返されます。

例えば、メタデータがない場合、上記の結果は次のようになります:

 

 

このモデル・インスタンスには、両方の関連モデルが含まれています。filter()map()を使って、関連するモデルのインスタンスを取得します。

 

 

 

終わりに

 

今回の記事は以上になります。

次回は[第14回] データをクラウドに同期する簡単な方法を学びましょう。

ご覧いただきありがとうございます。

 

 

 

 

 

 

コメント