graphqlで遊んでみて感じたことまとめ
導入
最近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