web-dev-qa-db-ja.com

オーバーフェッチまたはアンダーフェッチとは何ですか?

私はgraphQLを時々遊んでいます。 graphQLの前は、通常REST APIを使用します。多くの開発者は、graphQLがRESTのいくつかの問題(たとえば、オーバーフェッチとアンダーフェッチ)を修正すると述べています)を私はこの用語と混同します。

誰かがこのコンテキストで何がフェッチされすぎて何が不足しているのか説明できますか?

おかげで、

24
Saber Alex

オーバーフェッチとは、あまりにも多くのデータをフェッチすることです。つまり、使用しない応答にデータが含まれています。

アンダーフェッチでは、エンドポイントの呼び出しで十分なデータがないため、2番目のエンドポイントを呼び出す必要があります。

どちらの場合も、パフォーマンスの問題です。必要以上の帯域幅を使用するか、必要以上のHTTPリクエストを作成しています。

完璧な世界では、これらの問題は決して発生しません。あなたはあなたの製品に正確に正しいデータを与えるための正確なエンドポイントを持っているでしょう。

これらの問題は、多くの場合、製品をスケーリングして反復するときに発生します。ページで使用するデータは頻繁に変更され、各コンポーネントに正確に適切なデータを使用して個別のエンドポイントを維持するためのコストが多すぎます。

したがって、エンドポイントが多すぎないことと、エンドポイントが各コンポーネントのニーズに最も適合するようにすることが妥協点になります。これにより、場合によってはオーバーフェッチ(特定のコンポーネントで必要なデータよりも多くのデータがエンドポイントから提供される)や、一部のコンポーネントでアンダーフェッチ(2番目のエンドポイントを呼び出す必要がある)が発生します。


サーバーから必要なデータを要求できるので、GraphQLはこの問題を修正します。必要なものを指定し、サーバーへの1回のトリップでこのデータを取得し、このデータのみを取得します。

50
yachaka

オーバーフェッチとアンダーフェッチ Rubyのような動的言語では、オーバーフェッチとアンダーフェッチは2つの一般的な落とし穴です。

オーバーフェッチフラグメントで追加フィールドが宣言されているが、実際にはテンプレートで使用されていない場合、オーバーフェッチが発生します。これは、特定のフィールドの使用を削除するようにテンプレートコードが変更された場合に発生する可能性があります。

この変更に伴ってフラグメントが更新されない場合でも、不要になったときにプロパティがフェッチされます。単純なタイトルフィールドは実際には大したことではないかもしれませんが、このプロパティはより高価なネストされたデータツリーであった可能性があります。

アンダーフェッチフィールドがフラグメントで宣言されていないがテンプレートで使用されている場合、アンダーフェッチが発生します。この欠落したデータは、おそらくNoFieldErrorまたはnil値として表示されます。

さらに悪いことに、テンプレートがデータの依存関係を宣言していないが、呼び出し元が正しいデータを上流でフェッチしたために機能しているように見える場合、潜在的なアンダーフェッチバグがある可能性があります。ただし、この同じテンプレートを別のパスからレンダリングすると、データが欠落しているときにエラーが発生します。

0
ATIQ UR REHMAN