问题描述
我正在移交具有大量视图的Redshift数据库。我想可视化他们的依赖关系。
我在下面进行选择,收到了约500行,其中前两列显示了两个相关实体的名称。
SELECT
dependent_view.relname as dependent_entity_name,source_table.relname as entity_name,source_table.relkind as entity_type,count(distinct pg_attribute.attname) as joined_column_count
FROM pg_depend
JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid
JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid
JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid
JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid
AND pg_depend.refobjsubid = pg_attribute.attnum
JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace
WHERE
source_ns.nspname = 'public'
AND pg_attribute.attnum > 0
GROUP BY 1,2,3
ORDER BY 1,2;
我想要
- 图与
- 每个唯一实体名称1个节点
- 1条线,每行连接两个相关节点。
- 要在Draw.io或类似版本中使用结果
我不要
- 手动绘制
我尝试过
- 使用Smartdraw-绘制没有连接的实体
- 使用VisualParadigm-崩溃
- ModelXtractor-pg_class_info的权限被拒绝
有什么办法可以做到这一点?现有的软件工具或脚本?
解决方法
肯定有产生这种现象的方法。但是,图中的大量元素可能使其无法读取和使用。
我的第一个尝试是plantuml。格式简单明了,如果失败了,您很快就会失败。
从更一般的角度讲,这是一个经典的图Vizualization问题,带有节点和边。因此,您也可以使用更专业的图形可视化算法,例如使用force-directed layout,它可以自组织节点,并快速识别位于许多相关组中心的“集线器”。优点是,这些算法的设计目的是呈现比图复杂得多的图。 几百种关系。
如果您不想深入研究Fruchterman-Reingold算法或类似方法的复杂性,则可以使用某些库(现在有了一些搜索词),甚至可以使用开源工具,例如Gephi