首页 > 解决方案 > 如何将时间序列数据中的列作为数组返回

问题描述

我正在使用 postgres 和 timescaledb 来记录将用于仪表板/图表的数据。

我在获取我需要的数据时没有任何问题我只是不确定我是否以最有效的方式进行操作。

说我有这个查询

   SELECT time, queued_calls, active_calls 
   FROM call_data  ​
   ​ORDER BY time DESC LIMIT 100;

我的前端接收到这些数据以进行此类图表。

通过为每个值重复列名,我觉得这是非常低效的。

以更有效的方式发送数据会更好吗,例如每列作为这样的数据数组。

{
time: [...], 
queued_calls: [...], 
active_calls: [...]
}

我想我的问题是,我是否应该重组我的查询,以便列数据以某种方式在数组中,或者这是我应该在服务器上的查询之后在将其发送到客户端之前做的事情?

-- 更新 -- 附加信息

我使用带有 Express 和 Sequelize 作为 ORM 的 Node.js,但是在这种情况下,我只是通过 Sequelize 执行原始查询。

我在前端使用的图表库也将系列数据作为数组,所以我试图用一块石头杀死两只鸟。

前端图表数据格式:

xaxis:{
  categories: [...time]
}
series:[
   {name: "Queued Calls", data: [...queued_calls]},
   {name: "Active Calls", data: [...active_calls]}
]  

后端代码:

async function getLocationData(locationId) {
  return await db.sequelize.query(
    'SELECT time, queued_calls, active_calls FROM location_data WHERE location_id = :locationId ORDER BY time DESC LIMIT 100;',
    {
      replacements: { locationId },
      type: QueryTypes.SELECT,
    }
  );
}

...

app.get('/locationData/:locationId', async (req, res) => {
  try {
    const { locationId } = req.params;
    const results = await getLocationData(parseInt(locationId));
    res.send(results);
  } catch (e) {
    console.log('Error getting data', e);
  }
});

标签: sqlpostgresqltimescaledb

解决方案


如果服务器在发送时压缩数据,那么如果您以您正在考虑的数组结构发送数据,那么它不会对网络层产生太大影响。

如果您使用数组结构,您认为您正在破坏 JSON 的好处之一——数据结构。您可能会获得一些速度提升,但如果您想查看一段时间内的活动调用,您必须拥有正确的索引 - 并打开索引错误的可能性。

我建议保留数据原样。


推荐阅读