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

Posted

技术标签:

【中文标题】如何获取视图之间的mysql依赖关系?【英文标题】:How to obtain mysql dependencies between views? 【发布时间】:2013-01-30 12:13:03 【问题描述】:

我有一个 mysql 数据库,有 60 多个视图,一些是辅助的,一些是最终的。它们之间存在依赖关系。这当然会给我带来性能问题,但我没有设计这个数据库和系统。

为了加快某些报告的速度,我将最终视图具体化为表格。我也可以通过具体化辅助视图来加快这个过程,然后用它们来具体化其他视图,避免重新处理辅助视图。

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

除了手动分析每个视图之外,还有其他方法吗?

【问题讨论】:

【参考方案1】:

我使用以下查询从 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,'%')

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

【讨论】:

【参考方案2】:

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

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,'`%')

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

【讨论】:

【参考方案3】:

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

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

很难管理大约 50 个相互关联的视图。我还没有找到任何适合该任务的工具。

【讨论】:

以上是关于如何获取视图之间的mysql依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何:查看数据库对象的依赖关系

如何查询 BigQuery 视图和表的依赖关系?

如何找到对象文件之间的依赖关系?

如何解决多模块项目中模块之间的依赖关系?

如何在 CMake 中正确创建目标之间的依赖关系?

Oracle:如何循环并查找表之间的依赖/依赖关系,以便为每个表执行插入/更新操作?