我正在处理一个很大的地理层次结构,并希望可视化.
这是一个例子.
我有一个NodeHierarchy表存储节点之间的分层关系.表中的每一行表示一个节点.每个节点都有一个父节点.没有父级的节点是层次结构的根.
这是我如何创建我的表:
CREATE DATABASE HierarchyTest; GO USE HierarchyTest; GO CREATE TABLE NodeHierarchy ( PK_NodeID INT NOT NULL CONSTRAINT PK_NodeHierarchy PRIMARY KEY,FK_ParentNodeID INT NULL CONSTRAINT FK_NodeHierarchy_NodeHierarchy FOREIGN KEY REFERENCES NodeHierarchy(PK_NodeID),Name NVARCHAR(255) NOT NULL );
我有一个苏格兰城市和地点的例子.苏格兰是层次的根源.苏格兰的后裔是城市和场地.在这个喜事,父母“包含”一个孩子,所以我们说,例如“Barrowlands在格拉斯哥,格拉斯哥在苏格兰”.
此语句使用示例数据填充NodeHierachy表:
INSERT INTO NodeHierarchy(PK_NodeID,FK_ParentNodeID,Name) VALUES (1,NULL,N'Scotland'),(2,1,N'Glasgow'),(3,N'Edinburgh'),(4,N'St Andrews'),(5,2,N'The Barrowlands'),(6,N'The Cathouse'),(7,N'Carling Academy'),(8,N'SECC'),(9,N'King Tut''s Wah-Wah Hut'),(10,3,N'Henry''s Cellar Bar'),(11,N'The Bongo Club'),(12,N'Sneaky Pete''s'),(13,N'The Picture House'),(14,N'Potterrow'),(15,4,N'Aikman''s'),(16,N'The Union'),(17,N'Castle Sands');
SELECT * FROM NodeHierarchy的输出:
PK_NodeID FK_ParentNodeID Name ----------- --------------- --------------------------------- 1 NULL Scotland 2 1 Glasgow 3 1 Edinburgh 4 1 St Andrews 5 2 The Barrowlands 6 2 The Cathouse 7 2 Carling Academy 8 2 SECC 9 2 King Tut's Wah-Wah Hut 10 3 Henry's Cellar Bar 11 3 The Bongo Club 12 3 Sneaky Pete's 13 3 The Picture House 14 3 Potterrow 15 4 Aikman's 16 4 The Union 17 4 Castle Sands (17 row(s) affected)
在Freemind我画了这个等效图:
什么工具可以为我做最少的手动工作?
编辑:原来我说我想要将层次结构的“全部或部分”可视化.这里发布的解决方案无条件地可视化整个层次结构.这对于小型示例层次结构是适用的,但对于较大的层次结构,仅可视化其中的一部分可能更有用.
因为我没有指定我的意思是“部分”,所以我把这个从这个问题中删除了.我在another question年询问了部分可视化.
解决方法
如果你想要交互式的东西,那么Microsoft有一个可以从.NET使用的Automatic Graph Layout library.
您将要做的是通过使用以下脚本导出sql来输出DOT文件:http://data.stackexchange.com/stackoverflow/q/109885/,它将通过GraphViz运行并生成图片.
DOT语法相对简单 – 您可以手动编写它,然后从sql生成,并将其简单地粘贴到一个文件或其他东西(如.NET或PowerShell)中,该文件读取sql集并生成文件.
您可以使用SSIS进行自动化.我制作了一个包装,写出了DOT文件并运行graphviz,并每天保存我们系统的graphiacl快照.