我知道我们都在为SQL使用一堆ORM,但我想尝试一下本地驱动程序。执行Postgres后,映射数据的正确方法是什么?请参阅下面的两个问题。
我有桌子:
articles (id, title, text)
comments (id, article_id, text)
我想传回给客户端的数据是一组文章,每一篇文章都有一组注释:
[{ id: 1,
title: "Article 1",
text: "Random text",
comments: [{
id: 1,
article_id: 1,
text: "Hello",
}],
}];我可以使用两种不同的方法来实现这一点。
SELECT a.id, a.title, c.id, c.text, c.article_id
FROM articles a JOIN "comments" c ON a.id = c.article_id或
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我特别要求“每天使用”,这意味着更大的桌子。或者你知道其他的方法?我很想知道这些方法中是否有一种是流行的ORMs使用的,因为有了ORM,您可以很容易地获得数据,就像上面的文章数组示例中一样
发布于 2022-04-01 14:51:12
ORMs使用第一种方法来处理一对多的关系。根据提取策略执行一个或多个查询。分组在后端执行,按框架开箱即用。
例如,hibernate文档。
这是一个常见的解决方案,因为聚合函数在数据库中的实现方式不同。很难支持特定于数据库的实现。因此,这是第一种方法的优点,它将在任何数据库上以相同的方式工作。
关于第二种方法,我只看到了一个优势--返回记录的数量将大大减少,而且可能会节省与DB通信的时间。父表的列不会重复。但是我们不能说其中一种方法会更快,它取决于查询的复杂性和受影响的记录计数。此外,还可能存在与array_agg函数的高内存消耗有关的问题。
例如:
IMHO:
我倾向于使用第一种方法作为一般情况下的主要解决办法。聚合函数是很好的,它可以提高性能而不需要高的DB内存消耗。
https://stackoverflow.com/questions/71699685
复制相似问题