如何避免在循环内为子数据调用数据库查询

How to avoid calling DB queries inside of loops for child data

我一直在努力找出处理显示子数据的最佳、最有效的方法。在我的具体情况下,我使用 PHP 和 MySQL,但我觉得这更像是一种 "generally in any language" 的交易。

我的两个想法是(对于这个例子,我将列出发票及其行项目)

  1. 将子数据(发票项目)加入主数据(发票),以便只有一个查询 我的问题是,假设我在发票上有 500 个行项目(可能不现实,但事情发生了),那么我会从 MySQL 服务器向我的 PHP 脚本发送 500 倍的总发票数据,这听起来很荒谬,因为我只需要它一次。

  2. 第二个选项是,在遍历发票并显示整体发票数据的同时,select 发票的行项目。当然,这现在又联系了数据库 500 次。

是否有任何其他选项来处理这些具有逻辑意义的数据(使用给定模式)?我几乎 100% 肯定有,因为我不敢相信我是第一个想到这个问题的人,但我想我只是很难找到正确的方法来搜索关于这个主题的更多信息.

Joining the child data (invoice items) to the main data (invoices) as to only have a single query

这是处理此要求的常规方式。它确实处理冗余数据,并且有一些开销。

但是

  1. 这就是可以指定从客户端到 RDBMS 的压缩连接的原因...压缩减轻了冗余数据的网络开销。
  2. 单个结果集中的冗余数据比重复查询的成本要低得多。

大多数人只是在这种应用程序中检索冗余数据。 Crystal 报告等程序产品就是这样做的。

如果它对您不起作用,您可以检索并保存一个结果集作为您的主记录……也许是这样的。

   SELECT master_id, name, address, whatever
     FROM master m
    WHERE m.whatever = whatever
    ORDER BY whatever

然后,通过 master_id.

将它们放入关联数组中

然后,检索详细记录。

  SELECT d.master_id, d.detail_id, d.item, d.unit, d.quantity
    FROM detail d
    JOIN master m ON d.master_id = m.master_id
   WHERE m.whatever = whatever
   ORDER BY d.master_id, d.detail_id, whatever

您将获得一个结果集,其中包含所有相关的详细记录(发票项目),这些记录都标有 master_id 值。您可以在 php 程序中将它们与主记录进行匹配。您基本上是在应用程序代码中进行连接。

如果所有这些听起来都太让人头疼了...只需获取冗余数据并完成您的项目。如果需要,您可以随时进行优化。