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;
执行后会直接返回单行结果:
| name | attributes |
|---|---|
| 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
相关产品推荐
相关产品推荐

