首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用Postgres本机驱动程序与任何后端编程语言连接后,如何正确地对数据进行分组?

在使用Postgres本机驱动程序与任何后端编程语言连接后,如何正确地对数据进行分组?
EN

Stack Overflow用户
提问于 2022-03-31 22:12:10
回答 1查看 35关注 0票数 1

我知道我们都在为SQL使用一堆ORM,但我想尝试一下本地驱动程序。执行Postgres后,映射数据的正确方法是什么?请参阅下面的两个问题。

我有桌子:

articles (id, title, text)

comments (id, article_id, text)

我想传回给客户端的数据是一组文章,每一篇文章都有一组注释:

代码语言:javascript
复制
[{  id: 1,
    title: "Article 1",
    text: "Random text",
    comments: [{
        id: 1,
        article_id: 1,
        text: "Hello",
      }],
  }];

我可以使用两种不同的方法来实现这一点。

代码语言:javascript
复制
SELECT a.id, a.title, c.id, c.text, c.article_id
FROM articles a JOIN "comments" c ON a.id = c.article_id

代码语言:javascript
复制
SELECT a.id, a.title, array_agg((c.id, c.text, c.article_id)) AS comments  
FROM articles a 
JOIN comments c ON a.id = c.article_id 
GROUP BY c.article_id
  1. 第一个查询:我需要通过c.article_id对后端的数据进行手动分组
  2. 第二个查询:它将按PostgreSQL对其进行分组并创建一个数组,但这是正确的方法吗?

我特别要求“每天使用”,这意味着更大的桌子。或者你知道其他的方法?我很想知道这些方法中是否有一种是流行的ORMs使用的,因为有了ORM,您可以很容易地获得数据,就像上面的文章数组示例中一样

EN

回答 1

Stack Overflow用户

发布于 2022-04-01 14:51:12

ORMs使用第一种方法来处理一对多的关系。根据提取策略执行一个或多个查询。分组在后端执行,按框架开箱即用。

例如,hibernate文档

这是一个常见的解决方案,因为聚合函数在数据库中的实现方式不同。很难支持特定于数据库的实现。因此,这是第一种方法的优点,它将在任何数据库上以相同的方式工作。

关于第二种方法,我只看到了一个优势--返回记录的数量将大大减少,而且可能会节省与DB通信的时间。父表的列不会重复。但是我们不能说其中一种方法会更快,它取决于查询的复杂性和受影响的记录计数。此外,还可能存在与array_agg函数的高内存消耗有关的问题。

例如:

失忆

阿格

极限导致内存失控

IMHO:

我倾向于使用第一种方法作为一般情况下的主要解决办法。聚合函数是很好的,它可以提高性能而不需要高的DB内存消耗。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71699685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档