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

问题描述:

我一直在试图弄清楚什么是处理显示子数据的最好,最有效的方法。在我的具体情况下,我使用的是PHP和MySQL,但我认为这更像是“通常以任何语言”的交易。如何避免在子数据循环中调用数据库查询

我的两个想法是(在这个例子中,我将列出发票和其行项目)

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

  2. 第二种选择是,在循环发票并显示总发票数据的同时,选择发票的行项目。当然,这现在正在更多次地联系数据库500。

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

加入的子数据(发票项),以作为只有主数据(发票)有一个单一的查询

这是处理这一要求的传统方式。它确实处理冗余数据,并且存在一些开销。

但是。

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

大多数人只是在这种应用程序中检索冗余数据。程序产品像Crystal Reports这样做

如果它不适合你,你检索并保存一个结果集为您的主记录...也许这样的事情。

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程序中将它们匹配到主记录。你基本上是在应用程序代码中进行连接。

如果这听起来像脖子上的痛苦太多了......只是去冗余数据,并完成您的项目。如果必须的话,你可以随时优化。

+0

哦哇我没有想过在PHP中加入它。我会用我的真实数据建立一个基准,看看三种方法中的哪一种胜出。感谢你,我甚至没有考虑过压缩数据大小 –

+0

很好,经过了三种方法的大量测试后,在运行两个查询后将它们加入到PHP中,一次用于父数据,两次用于所有子数据(至少在我的情况下)击败了另外两个表现。每个父行的子数据调用显然丢失了,并且根本没有扩展,我认为在我的情况下,查询很难用所有额外的连接进行索引,所以查询成了罪魁祸首。 –

+0

看起来好像查询可以进行优化,但是如果您有大量数据要返回,冗余数据选项可能会最快。 –