Php 只需选择一个(获取/规则它们!),然后使用Ruby数组函数处理整个集合?

Php 只需选择一个(获取/规则它们!),然后使用Ruby数组函数处理整个集合?,php,ruby-on-rails,ruby,Php,Ruby On Rails,Ruby,我想知道,当浏览一组行时,每一行都会获取另一组行。例如,循环浏览一系列类别,并为每个类别获取其所有新闻文章。也许是显示在一个页面或类似的页面上。似乎有很多选择查询—1可以获取所有类别,每个类别一个查询可以获取文章。因此,我的问题是-在开始时简单地进行两次抓取是否更快: categories = Category.all articles = Articles.all …然后只需使用“按类别id选择文章上的位置”或“按类别id选择文章上的位置”,即可仅从文章数组中获取这些内容?用多个数组函数替换

我想知道,当浏览一组行时,每一行都会获取另一组行。例如,循环浏览一系列类别,并为每个类别获取其所有新闻文章。也许是显示在一个页面或类似的页面上。似乎有很多选择查询—1可以获取所有类别,每个类别一个查询可以获取文章。因此,我的问题是-在开始时简单地进行两次抓取是否更快:

categories = Category.all
articles = Articles.all
…然后只需使用“按类别id选择文章上的位置”或“按类别id选择文章上的位置”,即可仅从文章数组中获取这些内容?用多个数组函数替换多个SELECT查询,哪个更快?我还认为,根据行数的不同,每个应用程序可能会有所不同。我很想听听人们的想法,或者任何澄清这一点的链接,因为我自己在这件事上找不到太多


我上面的代码示例是RubyonRails,但这个问题实际上可能适用于任何给定的语言。我也经常使用PHP。

这取决于您想对数据做什么。你可以试试看

categories = Category.includes(:articles)

这是文件

我想你是在描述所谓的N+1问题,我对这个问题也不熟悉。下面是另一个解决此问题的堆栈溢出问题:

n+1是最糟糕的,尤其是当你想到像timpone指出的10000或1000万篇文章时。对于1000万篇文章,您将为单个请求命中DB 10000001次,因此称为n+1问题。避免这种情况。总是没有比这更好的了

如果类别与文章有很多关系,而文章与类别有属于关系,则可以使用includes预取关联,如下所示:

categories = Category.includes(:articles)
这将有两个查询,一个用于类别,另一个用于文章。您可以在两个显式的select/where语句中写出它,但我认为这样做在语义上更清晰。如果要检索所有类别,然后针对每个类别获取所有文章。您可以在Ruby中编写如下代码:

categories.articles.each do |article|
  # do stuff...
end

很明显,您指的是此类别实例的所有文章。

我只想计算两次获取的结果。一般来说,你应该知道你的应用程序在什么时候开始在数据库访问、查询等方面出现瓶颈。。。当您进入更大的数据集时,您上面提供的策略将开始出现问题,例如,假设有10万或10万篇文章。