【问题标题】:How to handle result filtering on a REST API endpoint?如何处理 REST API 端点上的结果过滤?
【发布时间】:2017-04-27 11:13:09
【问题描述】:

我有一个 Node.js REST API,通过 node-mysql 直接使用 MySQL 数据库。

我正在寻找一种以最高效的方式过滤端点上的数据库结果的方法。

目前,我有一个端点 /api/v2/matches,我的 API 代码在其中查询数据库并将结果作为 JSON 响应输出。

我计划在此端点上使用过滤器。例如/api/v2/matches?filter[team]=TeamId

在我的代码中过滤这些数据库结果的最佳方式/最高效的方式是什么?

我应该:

  • 查询数据库中的所有内容,并在我的结果数组上使用Array.prototype.filter() 或类似名称来正确过滤数据。

  • 根据req.query.filters 对象上传递的内容,以编程方式组装我的查询字符串并查询数据库。

请记住,我当前对该端点(返回所有结果的那个)的查询有几个 INNER JOINS 正在进行。我也在这个查询中使用LIMIT 50

【问题讨论】:

    标签: mysql node.js api api-design


    【解决方案1】:

    磁盘访问时间和数据传输是这里的主要瓶颈。但是,LIMIT 50 对此有一个有趣的含义。您应该在数据库查询中使用过滤器,因为它会限制数据库花费在搜索上的时间,并且如果您的数据库是远程的,它也会限制传输的数据量(如果您的数据库不是远程的,收益会更小,但还在那里)。与此相比,构建查询所产生的轻微开销可以忽略不计。

    SELECT * 查询当然是为提高速度而设计的,但您的 DBMS 必须覆盖整个数据集。您可以使用SELECT WHERE 获得更好的执行时间,尤其是如果您在数据库架构中提供适当的索引,因为您的结果限制为 50 个,即使使用 JOIN 也是如此。

    另外,请记住,SELECT WHERE 查询背后有多年的研究和加速它们的技巧,而 Array.prototype.filter 可能是 "if (lambda(x)) arr 的一个非常简单的实现.append(x)" 或类似的东西。几乎每家公司都使用它而不是 filter,这是有充分理由的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2019-10-30
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多