📈

graphqlで遊んでみて感じたことまとめ

2022/08/01に公開

導入

最近graphqlで遊んでいました。
そこで得たgraphqlの良いところや、活用するときにこうしたほうが良いよ。というところをまとめてます。
遊んでいたリポジトリはこちらです。このリポジトリのコードを読んでいる前提でこの記事は書いています。

graphqlを活用するコツ

ID型は最適化以外の目的では使わない

ID型はデータの一致を示すためのhashの意味しか持たせない方が良いです。
ID型はgraphql全体で一意である必要があります。参考
IDが共通だとキャッシュが有効化されたりします。DBのpkをauto incrementにしていたりすると、別テーブルでIDが被ることは一般的。これをID型にするとキャッシュがおかしくなってしまいます。
よって、アプリケーションが扱うフィールドにはID型は使わずに、キャッシュを利かせたいときにデータのhash値をIDとして付与することをお勧めします。

pkはNonNullにし、それ以外はNullableにする

pkが取得できなかったらそのデータは取得できないのでpkはNonNullとして定義する。
逆に、pk以外はpkだけ取得できたけど、pkからデータを取得しに行ったら失敗する可能性があるのでNullableにする。
アプリケーション的に取得できないわけない!といった場合は、ここはNullableにしてAPIを受け取った方でハンドリングしたほうが良いです。

graphqlの背後のデータストア設計のコツ

一覧取得系APIはpkだけ返す

pk以外を返してもよいが無駄になります。よって、pkのみ返す。
pkを使ってBatchGetするAPIを別途定義して、pk一覧を取得して、idをもとにデータを取得。といった具体にリクエストするのが良いです。

pkからデータを取得するAPIは必ずpk複数指定可能にする

pkからデータを取得するAPIは、pkを1つだけ受け付ける物は作らず、複数受け付けるようにして、一括で取得できるようにする。
一括で取得できないとN+1問題が発生します。

まとめ

ざっと箇条書きのようにgraphqlを設計するときのコツを列挙しました。
graphqlの使い方や仕組みはリポジトリを見てください。
リポジトリの設計の背景をまとめたのがこの記事になります。

Discussion