最近偶然发现了这种情况。做两个查询可能是" light"在我的情况下,我只想知道什么是更好的大数据集。总体上更好(性能,速度等)。
目前我单独查询2 1:N(has-many)关系并减少/转换应用程序中的数据。
看起来这个变形/缩小了:
[
'field' => 'value',
'hasMany-1' => [],
'hasMany-2' => []
]
我实际上有点想要做单独的查询,因为它消除了减少它的痛苦,如果我有超过2个hasMany查询并且更可读但代码目前有效,所以我可能只是做它下一次。
妥协是否值得?同样,在我的情况下,它可能是非常轻的&#34;因为我只有很少的行(<100)并且结构并不复杂,因为它还处于早期阶段。
但是如果我下次遇到这种情况并且数据集越来越大,我就会问。
**编辑**
所以,我所谈论的有很多关系是:customer
有很多phones
和pets
。
我当前的查询返回此结果(简化):
customer_id | pet_name | phone
1 | john | 1234
1 | john | 5678
2 | jane | 1357
2 | jane | 2468
2 | joe | 1357
2 | joe | 2468
我认为我的查询很好。对于某些行重复似乎是合乎逻辑的,因为另一个字段具有不同的值。
答案 0 :(得分:4)
通常,您应该发出一个查询并让优化程序为您完成工作。至少,这可以节省多次到数据库和查询编译的往返。
在某些情况下,多个查询可以获得更好的性能,但我认为最好从单个查询开始。
对于多个多对多维度的连接,您有一个特定问题。没有必要“通常”进行连接,然后“减少”结果。有更有效的方法。
我建议你问另一个问题。提供样本数据,所需结果以及您正在尝试的逻辑的说明。您可以学习更有效的方法来编写单个查询。
答案 1 :(得分:0)
你没有描述你的表结构所以我假设很少。 如果您想将宠物和手机放在一行,请执行以下操作:
select c.customer_id, c.name,
array_to_string((array_agg(p.pet_name)),',') pet_names
array_to_string((array_agg(ph.phone)),',') phones
from customer c, pet p, phones ph
where p.customer_id=1
and p.customer_id=c.customer_id
and ph.customer_id=c.customer_id
group by c.customer_id, c.name
如果您希望每个pet_name包含所有可能的电话号码:
select c.customer_id, c.name,
p.pet_name
array_to_string((array_agg(ph.phone)),',') phones
from customer c, pet p, phones ph
where p.customer_id=1
and p.customer_id=c.customer_id
and ph.customer_id=c.customer_id
group by c.customer_id, c.name, p.pet_name
如果我们谈论性能,那么通过customer_id对宠物和手机进行2次查询会更快。但是,直到你有数百万行,它并不那么重要。 当然你应该在customer_id上有索引。