GraphQLスキーマのきれいなグラフについて考えてた

GraphQLスキーマの具体的の利便性はおいておいて、スキーマが表すグラフの形をみてきれいということは可能なのだろうかと考えていた。

次数の偏りが少ないほうがいい?最短経路が短い方がいい?

GraphQLにはQuery型という特権的な型がある、APIを拡張するたびに、どんどんQueryのフィールドを追加していってるけど、これは仕方がないことのなのかと考えたのが発端だ。

Query --> A
Query --> B
Query --> C

という感じでQueryからA,B,Cという型へのフィールドをはやしている。フィールドがグラフのエッジだ。

上のグラフの代わりに、以下のグラフを考えた。

Query --> A
Query --> B
B --> C

というふうに、Query --> Cのかわりに B --> C のほうが、グラフの形がきれいなのでは、と考えた。

感覚的に、グラフの次数(各頂点に接続する辺の数)の偏りが小さい方が感覚的にきれいなグラフに見えそうというだけだ。

逆に、上のグラフのほうがCまで最短経路が短いわけだからきれいなグラフだと言える気もする。

具体的なスキーマを考えたとき、もし Query --> C が

type Query {
  c(b_name: String!): C
}

というフィールドでbと関係のあるCをとってきたいというときには、B --> C のほうがよいと言えないだろうか。

実装のことを考えると Query --> B --> C よりも Query --> C のほうがパフォーマンスがいいからそうしたいというケースもありそうだ。そうなるとスキーマ設計から実装を分けて考えるのは不可能になり、それは本当にいいのだろうかと悩む。

サイクルがあってもいい?

上のグラフにC --> Bを足すと、サイクルができる。

Query --> A
Query --> B
B --> C
C --> B

サイクルがあると、B --> C --> B --> C ... という無限に辿れそうだからよくなさそうな感じはする。しかし実際のサーバではネストの深さの制限をすることが可能なので問題にはならなそうだ。

サイクルの数だったらスキーマから数えることは可能だろうなと思ったが、あまり意味はなさそうだ。