【问题标题】:MYSQL summary tables for Web App adviceWeb App 建议的 MYSQL 汇总表
【发布时间】:2011-05-16 04:47:08
【问题描述】:

我有一个数据库,其中我有许多表中的数据,例如关系

TABLE Cars (stock)
---------------------    
Model   colourid  Doors
----------------------
xyz       0       2
xyz       1       4

TABLE Colour

Colourid  Name
---------------------
0         Red
1         Green

我需要生成几个常规摘要,例如格式中的摘要。

         | colour               |  Num Doors
Model    | red   green   blue   |  2   4   5   6
---------|----------------------|------------------
XYZ      |  1     2      3      |  4   5   3   5    <<< Numbers in stock

更新 - “一辆汽车可以有门的排列,例如 2 门汽车或 4 门汽车。在摘要中,它显示了特定型号的每种门配置的库存汽车数量,例如有 4 辆汽车xyz 有 2 扇门。请记住,这只是一个例子,汽车可能不是最好的例子,我当时能想到的就是“

不幸的是,重新排列表格可能会使它们更适合摘要,但不适用于日常操作。

我可以想到几种方法来生成这些摘要的例如/多个 SQL 查询,并将表放在表示级别,SQL 级别 UNION 与多个查询,VIEWS 与多个嵌套查询或最后 cron 作业或触发代码以生成数据包含适合汇总查询和报告的数据的汇总表。

我想知道是否有人可以给我一些指导,考虑到这些方法效率不高,在多用户环境中变得更糟,并且可能需要定期总结。

【问题讨论】:

  • 看看JOIN教程;这可能与您正在寻找的内容相似w3schools.com/sql/sql_join.asp
  • 解释Doors 从您的第一个示例到第二个示例的关系?我有点困惑。
  • @Stephen 4 确定汽车可以有门布置,例如 2 门汽车或 4 门汽车。在摘要中,它显示了特定型号的每种车门配置的库存汽车数量。请记住,这只是一个例子,汽车可能不是我能想到的最好的例子。
  • @Piskvor JOIN 用于前两个表,但是,由于其复杂性,我认为生成摘要需要更多
  • 我已经更新了一些帖子

标签: sql mysql database-design web-applications


【解决方案1】:

我认为您需要一个数据仓库解决方案 - 基本上构建一个新架构仅用于报告目的并定期填充这些表。

汇总表可以有多种更新机制 -

  1. 计划定期执行此操作的后台作业。如果不需要最新信息,这是最好的。

  2. 使用主事务表上的触发器更新汇总表。这可能会有些复杂,但如果您需要最新信息,这可能是有保证的。

  3. 每当在显示报告之前绘制报告时更新报告表。您可以使用一些锚值来确保您不会过于频繁地重新计算整个报表,只需考虑上次绘制报表之后的新行或新更新的行。

唯一的问题是,每当在透视列中添加新值时,您都需要多次更改表。

【讨论】:

  • 谢谢,我认为 1 和 3 的组合可能是最好的路线。如果在查看报告更新之前没有更新表格,否则如果没有查看定期更新。如果摘要最近已更新,则无论哪种方式都不要更新。
  • 是的,这通常应该是这种方法——如果你制定出你的增量更新逻辑,你也会做得很好——例如。对整个表求和可能太慢了,因此您可能需要像 existing_sum + sum(new_records_only) 这样的替代公式,以便可以极大地扩展此解决方案。
  • 是的,我刚刚意识到报告是捕获数据的数据透视表。
【解决方案2】:

与 Roopesh 的回答略有不同

根据数据库的大小、可用的服务器资源、运行这些报告的频率,特别是如果您不允许有陈旧的报告,您可以在概念上与上述相同,但不使用真实的表格,而是意见

这里有两个链接可以帮助您入门

注意事项:

  • 与物化结果相比,您无需运行任何 DDL(您甚至可以跳过 CREATE VIEW 并使用直接的动态 SQL)
  • 复杂性可比的,但略低(在具体化场景中添加新值需要 1)ALTER TABLE ADD COLUMN,2)INSERT;使用这种方法,您只需修改 SELECT 以分析另一个案例。基本上复杂度与 INSERT 相同)
  • 如果用户直接从数据库中多次查看报告,性能可能会更差,但如前所述,它还保证数据是最新的

【讨论】:

  • 我认为需要以编程方式完成更改表(在 dw soln 中)和更改为选择查询(如果我们使用枢轴查询)。每当数据发生变化时,都没有必要依赖开发人员进行修改。
  • @Roopesh Shenoy,是的,明白了。我只是想展示一个更简单的解决方案(不过,它的可扩展性不高)。
  • @Unreason 我喜欢 Pivot 示例
  • @Unreason 我想我可以将每次查询的选定结果数保持在不超过 15,000 条记录。
  • @andicrook,我不明白您为什么引用记录数 - 正如我所说,报告的使用模式决定了非规范化是否合理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多