为什么Gorm中的Preload函数是“好的做法”,因为每次调用它时都会检索给定表的所有记录(急切加载)?
我看到很多人在处理关系时都将“预加载”作为一种很好的解决方案,但我不明白为什么。
答案 0 :(得分:2)
我不知道你在说什么;
但一般而言;联接/查找的计算成本是不同的。
给出了两个表:kake和topping:
kake(名称为str) 打顶(名称为str)
如果您加入,与比赛时相比,您的集合(磁盘输入-输出,内存)要大得多;
因为您需要计算所有置换。
蛋糕:
1|napoleon
2|chocolate
3|cheese
摘心:
1|butter
2|frosting
3|cacao
4|white cacao
5|goat chese
6|cow chese
7|chinese chese
...|nuts
...|avocado
...|white chocolate
11:cherry-flavor
使用普通联接,您将获得3 x 11的结果-所有蛋糕乘以所有浇头。
这看似微不足道,但当表中有1000多个记录时却并非如此。
具有“预加载”功能;
get all topings for napoleon => only frosting
get all topings for chocolate => only cacao
get all toppings for cheese => only cow chese and only chinise chese
然后;给我拿破仑+巧克力+奶酪,
您可以避免:黄油,樱桃味
所以您只选择相关的记录。
这并不简单。 它会引起其他问题。 但通常来说,如果您可以说:
我需要所有x,y,z,而不需要a,b,c。
我希望这是有道理的。