GraphQL ID設計

きっかけ

本業で初めてGraphQLに触れた。 GraphQLでapiを叩く時、IDの仕様に癖があったので調べてみた。

参考

booth.pm

本題

そもそもGraphQlのスキーマ設計は何を基準に行うべきなのか?

GraphQLスキーマ設計ガイド 第2版 - わかめの自動売り場 - BOOTH では

GitHub v4 API に倣え!

とあるように大手APIの仕様を参考にする。

GitHubのGraphQLAPIは、 Reactのクライアントライブラリである Relay 向けの仕様へ準拠されている。

https://github.com/facebook/relay

つまり フロントエンド側で使うライブラリは ApolloやRelayが有名でそれらに合わせて設計するのが良さそう。

Apollo、RelayにあせてIDを設計すると IDはユニークでグローバルな必要がある。

たとえばUser型のidを123と返すのではなく、User:123や、これを base64 encode したVXNlcjoxMjM=とする。

理由は、ApolloやRelayはキャッシュ機構を持っておりこのidをキーとしているため、 idが重複してしまうとキャッシュが上書きされバグの原因となる。

query FindUser{
  user(id: "users: 1"){
    id
    name
  }

"users: 1" テーブル名 : ID

このようにテーブル間を跨いでユニークな値にする事で Node の id の値のみから、任意のデータを見つけられるようになる。

UserのIDから検索をしたい時に単にID"1"のみを指定した場合どのテーブルかを判別できない。

以上