-
Notifications
You must be signed in to change notification settings - Fork 0
SQLGraphExplorer‐3
Xin edited this page Nov 16, 2023
·
2 revisions
- 尝试去找一些解析sql并生成关系代数图的工具。
(不好用,稍微复杂一点就error,遂放弃) - 于是尝试自己来做,之前想歪了,做的是列之间的直接关系:
- 但上次老师说用关系代数的思想来理解,《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查看结果)
- 之前说Graphviz不太好用,是因为节点需要一个个画,很麻烦。
- 但在github上有个SQL Graphviz,它也是个解析sql并生成列级别关系图的python脚本:
- 所以我看了看源码,发现它也是用Graphviz绘图,发现Graphviz支持html的表格语法(这就很舒服)。于是改了改绘图代码。
总而言之,打算继续用graphviz绘图,这都是细节问题。
- 关系代数只能覆盖sql的核心语句,有些扩展语句并没有直接的对应关系。
- 所以对于覆盖不到的扩展语法,例如 MERGE INTO ,应该如何去理解?目前的做法看语义,按表、列两个级别实现。
- 在网上找的相关工具还有论文,基本上都是上面的列级别的可视化,而且大部分都是简单直接关系。~~说白了没有现成的可以参考的思路。~~比如已经做出来的一个商业产品yworks
- 目前的想法:
- 首先是要底层graph绘图要从一维列级别升级到二维数据级别。做到二维表格的维护。(但这样做工作量可能会大一些,所以有另一种想法,就是Java连接数据库,直接让数据库来维护。)
- 然后是在列关系的基础上,“细化”数据的具体来源。比如说 CASE 。