GraphQL ID設計
きっかけ
本業で初めてGraphQLに触れた。 GraphQLでapiを叩く時、IDの仕様に癖があったので調べてみた。
参考
本題
そもそもGraphQlのスキーマ設計は何を基準に行うべきなのか?
GraphQLスキーマ設計ガイド 第2版 - わかめの自動売り場 - BOOTH では
とあるように大手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"のみを指定した場合どのテーブルかを判別できない。
以上