Skip to content

SQLGraphExplorer‐3

Xin edited this page Nov 16, 2023 · 2 revisions

1. Sql关系的列级别可视化

1.1 关系代数

  1. 尝试去找一些解析sql并生成关系代数图的工具。(不好用,稍微复杂一点就error,遂放弃)
  2. 于是尝试自己来做,之前想歪了,做的是列之间的直接关系:
EAST51_YGB
  1. 但上次老师说用关系代数的思想来理解,《Antlr4 权威指南》中有一个使用栈来解决问题的例子,遂更新思路:维护表和列两个栈,来实现中间层的关系维护。具体而言:
SELECT
	......
FROM
  irs_model.EAST5_YGB T1
  INNER JOIN (
    SELECT
      L.ID ID,
      T.TABLENAME TABLE_NAME,
      I.INSTITUTIONID INSTITUTIONID,
      L.TERM TERM
    FROM
      LEDGERREPORT L
      LEFT JOIN REPORTTEMPLATE T ON L.LEDGERREPORTTEMPLATE_ID = T.ID
      LEFT JOIN INSTITUTION I ON L.INSTITUTION_ID = I.ID
    WHERE
      L.TERM = V_DATE
      AND T.TABLENAME = V_LOG.TABLNO
  ) T2 ON (T2.TABLE_NAME = V_LOG.TABLNO)
WHERE
  T1.CJRQ = V_DATE;
  • 之前想要实现直接从最里层指个箭头到最外层。
  • 现在通过维护栈来实现逐步箭头向外跳。(用vscode查看结果)

1.2 底层的绘图工具

  1. 之前说Graphviz不太好用,是因为节点需要一个个画,很麻烦。
  2. 但在github上有个SQL Graphviz,它也是个解析sql并生成列级别关系图的python脚本:

  1. 所以我看了看源码,发现它也是用Graphviz绘图,发现Graphviz支持html的表格语法(这就很舒服)。于是改了改绘图代码。

总而言之,打算继续用graphviz绘图,这都是细节问题。

1.3 关系代数的局限化

  1. 关系代数只能覆盖sql的核心语句,有些扩展语句并没有直接的对应关系。
  2. 所以对于覆盖不到的扩展语法,例如 MERGE INTO ,应该如何去理解?目前的做法看语义,按表、列两个级别实现。

2. sql关系的数据级别可视化(TODO)

  1. 在网上找的相关工具还有论文,基本上都是上面的列级别的可视化,而且大部分都是简单直接关系。~~说白了没有现成的可以参考的思路。~~比如已经做出来的一个商业产品yworks
  2. 目前的想法:
    • 首先是要底层graph绘图要从一维列级别升级到二维数据级别。做到二维表格的维护。(但这样做工作量可能会大一些,所以有另一种想法,就是Java连接数据库,直接让数据库来维护。)
    • 然后是在列关系的基础上,“细化”数据的具体来源。比如说 CASE 。

3. 目前的结果:

Clone this wiki locally