Skip to content

N + 1 問題 と collect_path.yml について ​

目的 ​

GraphQLはN+1問題が発生しやすい。UZUではentの手法に従い、Dataloaderではなくeager loadingアプローチを使用。

解決する問題 ​

  • クエリにvalidParticipantsなどのフィールドが含まれる場合、participantsをeager loadする必要がある
  • クエリはクライアントが生成するため、バックエンドは要求されるフィールドを予測できない
  • collect_path.ymlは実行時にeager loadが必要なフィールドを定義

設定フォーマット ​

yaml
Event:
  validParticipants:
    - with: Participants
      type: Participant

使用手順 ​

1. collect_path.yamlの設定 ​

  • 第1レベル: GraphQLタイプ
  • 第2レベル: GraphQLフィールド
  • with: eager load用のエンティティ名(entのWith○○と一致)
  • type: エンティティタイプ
  • method: 複雑なシナリオ用のカスタムメソッド

2. コード生成 ​

bash
go generate ./internal/ent/generate_collect_path.go

3. リゾルバーでの使用 ​

go
func (r *queryResolver) Authors(ctx context.Context) ([]*ent.Author, error) {
    return r.client.Author.Query().CollectPaths(ctx).All(ctx)
}