【问题标题】:Efficient SQL table merge and paginate高效的 SQL 表合并和分页
【发布时间】:2020-01-17 16:07:57
【问题描述】:

我有 5 个不同的表,即:

  • 存款
  • 提款
  • 付款
  • 转移
  • 交流

我需要合并这些表并从Nodejs API 返回一个分页结果给客户端。我不知道如何有效地做到这一点,因为这些表真的很大(每个 > 100K 行)。

我正在考虑两种我可以采取的方法。

  1. 将每个表中的单个查询结果流式传输到节点 js 后端,并在那里实现一些合并逻辑。

  1. 以某种方式在数据库级别执行合并,方法是创建某种虚拟表或某些持久视图,然后对其执行查询。

你们觉得呢?

感谢您的宝贵时间!

【问题讨论】:

  • 请显示这些表格的结构,以便我们能够更准确地提供帮助。一般来说,我会说,使用数据库做某事的最高效方式是在数据库上,例如带有视图或带有有效连接的准备好的语句。
  • 在数据库中,是否有一个通用的“事务”表(如果没有,我会感到惊讶)?如果是这样,为什么不从中进行分页呢?
  • 你用的是什么数据库?
  • 有很多方法可以做到这一点,比如非规范化表格。您需要提供有关您的基础架构、数据库、索引以及您希望运行的查询等的更多信息...
  • 出于什么目的需要这些表中的数据?是报告吗?您要根据这些记录进行计算吗?

标签: sql node.js bigdata


【解决方案1】:

如果您打算使用 DB 数据进行操作,那么从我的角度来看,最有效的方法是在 DB 级别上,通过 JOINUNIONSub queries。如上所述,假设 Node.js 流式传输 concept,对大型数据集采用流式传输始终是一种好习惯。

const request = new sql.Request()
request.stream = true // You can set streaming differently for each request
request.query('select * from verylargetable')

如果您希望将此数据进一步用于其他一些客户端应用程序,您可以考虑使用CSV stringifier Node.js 包,将 SQL 输出数据转换为 CSV 文本格式。

【讨论】:

    【解决方案2】:

    在不了解表结构的情况下很难提供解决方案。您可以使用通过 INNER JOIN 创建的视图,并使用该视图选择属性以将数据返回给 API 请求,或者您可以直接使用 INNER JOIN 来返回数据。使用过程返回数据。

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 2019-04-20
      • 2018-09-21
      • 1970-01-01
      • 2020-03-08
      相关资源
      最近更新 更多