Slide 1

Slide 1 text

GraphQLと RDBのインピーダンスミスマッチ 社内 LT会 2024年 6月

Slide 2

Slide 2 text

今日はこの記事につ いて話します

Slide 3

Slide 3 text

この記事を読んでこう思いませんでしたか?

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

課題感についてよくわからないという方が多かったのではないかと思い 今回はこの記事に書いた課題感について話します

Slide 6

Slide 6 text

この記事で伝えたいこと 1. RDBのテーブル設計と GraphQLのスキーマは一致しない(ことが多い) 2. どちらかに合わせると良くない 3. インピーダンスミスマッチを解消するには、 Viewが便利 今回は省略

Slide 7

Slide 7 text

RDBのテーブル設計と GraphQLのスキーマは一致しない(ことが多い) RDB GraphQL

Slide 8

Slide 8 text

RDBの正規化は崩したくない。 。 。 じゃあ GraphQLのスキーマを テーブルの構造と一緒にしちゃえばいいじゃん!

Slide 9

Slide 9 text

実際にそういうフレームワークは結構ある Hasura AppSync Redwood.jsも元々の発想はそうかも

Slide 10

Slide 10 text

何が悪いの?

Slide 11

Slide 11 text

どちらかに合わせると良くない モデルのネストは DataLoaderを使っても 1+1クエリになる クライアント側で深いネストのオブジェクトでコードが煩雑になる クライアント側は正規化された構造に関心がない

Slide 12

Slide 12 text

1+1クエリになる こういうクエリがある時 query { users { id name posts { id title } } }

Slide 13

Slide 13 text

1+1クエリになる usersに紐づく postsを取得するには、下のようなクエリがそれぞれ発行される -- まずusersを取得 SELECT * FROM users; -- usersのidを使ってpostsを取得 SELECT * FROM posts WHERE user_id in ({user_ids}); 2回 RDBに問い合わせすることになる

Slide 14

Slide 14 text

つまりネストするたびに RDBへの問い合わせが増える 正規化されたテーブル構造をそのまま GraphQLに露出すると、経由するテーブルの数だけモ デルをネストすることになる

Slide 15

Slide 15 text

そもそもネストが深いオブジェクトをフロントエンドに押しつけたくな い イミュータブルなモデルそのまま露出するとこんな感じになる type UserResponse = { id: string; latestName: { name: string; // 変更履歴を残してるからテーブルが別 } posts: { id: string; latestTitle: { title: string; // 変更履歴を残してるからテーブルが別 } comments: { id: string; latestComment: { body: string; // 変更履歴を残してるからテーブルが別 } ...

Slide 16

Slide 16 text

GraphQLはクライアント中心の API As we saw in the introduction, GraphQL is a client-centric API. This philosophy affects how we should design our GraphQL APIs too. While it's tempting to be designing APIs in terms of backend resources or entities, it's very important to design GraphQL APIs with client use cases in mind first, before anything else. (序章で見たように、 )GraphQLはクライアント中心の APIである。この哲学は私たちが GraphQL APIをどのように設計すべきかにも影響を与える。 APIの設計はバックエンドのリソ ースやエンティティを元に実装される誘惑に駆られるが、最初に GraphQL APIクライアント のユースケースを考慮して設計することが重要である。 Production Ready GraphQL (P.24 GraphQL Schema Design: Client first) - Marc-André Giroux

Slide 17

Slide 17 text

モデルのネストは少ないほうがいいよね? じゃあどうする?

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

ご清聴ありがとうございました