You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postgres一对多关联数据优化:如何返回数组格式结果?

Postgres一对多关联数据优化:合并多端值为数组或前端处理方案

一、Postgres端合并多端值为数组(可行且推荐)

完全可以通过Postgres的聚合函数array_agg()实现多端值合并为数组,直接返回无冗余的单行结果,减少数据传输量和前端处理成本。

示例SQL

假设你的表结构是products(主表,存商品名称等)和product_attributes(从表,存商品属性值,关联字段product_id):

SELECT 
  p.name,
  array_agg(pa.value) AS attributes
FROM products p
JOIN product_attributes pa ON p.id = pa.product_id
WHERE p.name = 'Shirt'
GROUP BY p.name;

执行后会直接返回单行结果:

nameattributes
Shirt{Medium, Red}

如果需要去重或排序,可以给array_agg()加参数,比如去重:array_agg(DISTINCT pa.value),排序:array_agg(pa.value ORDER BY pa.value)。

二、前端处理方案(当数据库端无法修改时)

如果因为权限、业务限制等原因不能修改查询语句,前端可以通过分组聚合来处理冗余数据,最优方式是用JavaScript的Array.prototype.reduce()方法,高效合并重复项:

示例代码

假设接口返回的原始数据是:

const rawData = [
  { name: 'Shirt', value: 'Medium' },
  { name: 'Shirt', value: 'Red' },
  { name: 'Pants', value: 'Large' }
];

处理逻辑:

const processedData = Object.values(rawData.reduce((acc, item) => {
  if (!acc[item.name]) {
    acc[item.name] = {
      name: item.name,
      values: []
    };
  }
  acc[item.name].values.push(item.value);
  return acc;
}, {}));

处理后得到结构化数据:

[
  { name: 'Shirt', values: ['Medium', 'Red'] },
  { name: 'Pants', values: ['Large'] }
]

这种方式时间复杂度为O(n),是前端处理这类数据的高效方案。

内容的提问来源于stack exchange,提问作者ohShoes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:05:23