45

我有时一直在玩 graphQL。在 graphQL 之前,我们通常使用 REST API。许多开发人员表示,graphQL 修复了 REST 的一些问题。(例如过度获取和获取不足)。我对这个术语感到困惑。

有人可以解释在这种情况下过度获取和获取不足吗?

谢谢,

4

3 回答 3

93

过度获取是获取太多数据,这意味着响应中有您不使用的数据。

获取不足是调用端点时没有足够的数据,迫使您调用第二个端点。

在这两种情况下,它们都是性能问题:您使用的带宽比理想的多,或者您发出的 HTTP 请求比理想的多。

在一个完美的世界里,这些问题永远不会出现;您将拥有完全正确的端点来为您的产品提供完全正确的数据。

当您对产品进行扩展和迭代时,通常会出现这些问题。您在页面上使用的数据经常发生变化,并且为每个组件维护一个具有完全正确数据的单独端点的成本变得过高。

因此,您最终会在没有太多端点和让端点最适合每个组件需求之间做出折衷。这将导致在某些情况下过度获取(端点将提供比一个特定组件所需的数据更多的数据),而在其他情况下会导致获取不足(您将需要调用第二个端点)。


GraphQL 解决了这个问题,因为它允许你从服务器请求你想要的数据。您指定您需要什么,并且将在一次访问服务器时获取此数据,并且仅此数据。

于 2017-06-15T13:06:46.047 回答
1

过度获取意味着您正在获取此时无用的无关变量。 Under fetching意味着您正在获取此时所需的较少变量

于 2020-09-18T06:45:23.540 回答
0

过度获取和不足获取 在像 Ruby 这样的动态语言中,过度获取和不足获取是两个常见的陷阱。

过度 获取 当在片段中声明了附加字段但实际上并未在模板中使用时,就会发生过度获取。当修改模板代码以删除某个字段的使用时,可能会发生这种情况。

如果片段没有随着这个变化而更新,当我们不再需要它时,仍然会获取该属性。一个简单的标题字段在实践中可能没什么大不了的,但这个属性可能是一个更昂贵的嵌套数据树。

提取 不足 当字段未在片段中声明但在模板中使用时,会发生提取不足。这种缺失的数据可能会以 NoFieldError 或 nil 值的形式出现。

更糟糕的是,当模板未声明数据依赖关系但似乎正在工作时,可能存在潜在的未获取错误,因为它的调用者恰好在上游获取正确的数据。但是,当从不同的路径呈现相同的模板时,它会在丢失数据时出错。

于 2019-03-16T09:03:50.297 回答