【问题标题】:MySQL custom reporting strategyMySQL 自定义报表策略
【发布时间】:2012-02-08 14:30:49
【问题描述】:

我们有一个 PHP/MySQL 应用程序,用户可以在其中创建自己的“数据库”,这可能会变得相当复杂。在 MySQL 上,它被构造为一组属性表,包含 record_idfield_idfield_value 等列。我很清楚这种结构的利弊,所以请认为这不会改变。

我们已经有一个自定义的高级搜索系统,用户可以通过组合来自任何字段的条件,在字段之间和字段内使用布尔运算符来查询这些数据库。

现在我们必须实现一个报告功能,让他们能够制作自己的报告。这可能包括关于一对多关系的多组数据。

例如,考虑一个“人”数据库​​,其中每个人可能有多个联系人和多个地址。例如,通过我们的自定义搜索,可以轻松列出所有出生在美国的人。但我还想在结果集中显示每个人的所有联系人和地址。

我可以看到两种可能的解决方案:

  1. 带有多个 JOIN 语句的单个 SQL 查询来获取所有数据。在这种情况下,每个人可能有多行,具体取决于他们有多少联系人和地址,我必须在显示(或组织)结果的 PHP 循环中处理这些问题。恐怕这会变得过于复杂,考虑到一份报告可能包含无限数量的一对多信息块(在我的示例中,我只有两个,地址和联系人)。

  2. 对于每个人,运行“n”个附加查询,一个用于一对多数据的每个块。在我的示例中,这将是一个联系人查询,另一个是地址查询。这种方法可能会导致运行大量查询来构建整个报告。

我知道这两种方法都有其缺点,但是有没有“推荐”的方法来处理这种情况?

【问题讨论】:

    标签: php mysql reporting


    【解决方案1】:

    这当然取决于您认为检索所有数据必须进行的查询数量。从性能的角度来看,建议执行大连接,因为它的处理效率远高于多个小查询。

    您会发现使用第二种方法比使用第一种方法需要更长的时间。

    【讨论】:

    • 即使在 MySQL 上?我的经验是 MS SQL Server 可以很好地处理包含许多连接的大型查询,但 MySQL 似乎没有那么高效。
    • MySQL 在处理大型连接时非常高效。我无法评论您的特殊情况,但有时它可以帮助为您要加入记录的列创建索引。在某些情况下,这可以大大提高性能。
    • 我已经有几个索引,但我猜数据库结构是这里的实际瓶颈(而且,正如我所说,我现在无法更改它)。我会尝试你的建议,我一直在避免它,因为我仍然无法弄清楚 PHP 循环所需的逻辑。
    • 我一直在做类似的事情。我所做的是保存表之间的依赖关系以及在数据库中构建报告所需的其他信息,并从那里构建它。根据基本数据类型和需要显示的字段,您可以获取依赖项并评估需要哪些连接。^
    • 构建连接对我来说不是问题。我正在做与您描述的非常相似的事情。问题是如何处理 PHP 循环中的所有重复数据(比如记住前一行中的多个 id,并根据当前 id 的更改显示信息)。但我想我最终可以弄清楚,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多