如何获取视图之间的mysql依赖关系?

时间:2013-01-30 12:13:04

标签: mysql sql view graph

我有一个超过60个视图的mysql数据库,一些辅助和一些最终。他们之间有依赖关系。当然,这给了我性能问题,但我没有设计这个数据库和系统。

为了加快某些报告,我正在将最终视图转化为表格。我也可以通过实现辅助视图来加速这个过程,然后使用它们来实现其他视图,从而节省了辅助视图的重新处理。

要做到这一点,我需要一种方法来查看视图之间的依赖关系,因此我可以按正确的顺序实现视图。如果我可以将这些信息输入图表(例如使用Graphviz或Tikz等工具),那就太棒了。

除了手动分析每个视图外,还有什么办法吗?

3 个答案:

答案 0 :(得分:3)

我使用以下查询从FROM子句获取依赖项:

SELECT  views.TABLE_NAME As `View`, tab.TABLE_NAME AS `Input`
FROM information_schema.`TABLES` AS tab 
INNER JOIN information_schema.VIEWS AS views 
ON views.VIEW_DEFINITION LIKE CONCAT('%',tab.TABLE_NAME,'%')

然后我将输出提供给python脚本,该脚本使用ete2模块将依赖关系可视化为树结构。如果有人感兴趣,我可以分享脚本。 编辑:注意,我刚刚意识到,如果视图名称是另一个视图名称的子字符串,则此查询可能会导致问题。如果任何机构可以建议改进,请做。

答案 1 :(得分:2)

单独的视图查询可以在许多查询设计器中可视化,但数据库中的整个视图结构仍然不可观察。

  • MySQL Workbench和Oracle SQL Developer似乎将视图呈现为单独的对象。
  • SchemaSpy呈现视图图表,该图表基于字段名称,而不是FROM子句。

管理~50个互连视图很难。我还没有为这项任务找到任何安慰工具。

答案 2 :(得分:1)

  

编辑:注意,我刚刚意识到,如果视图名称是另一个视图名称的>子字符串,则此查询可能会导致问题。如果任何机构可以建议改进,请做。

SELECT  views.TABLE_NAME As `View`, tab.TABLE_NAME AS `Input`
FROM information_schema.`TABLES` AS tab 
INNER JOIN information_schema.VIEWS AS views 
ON views.VIEW_DEFINITION LIKE CONCAT('%`',tab.TABLE_NAME,'`%')

我认为%旁边的`符号确实消除了你的子字符串问题和其他一些问题。在实践中,这将起作用。我看到的唯一问题是当你有一个数据库,其中一些表名与列名相同,但在适当的数据库设计中,情况并非如此。