【发布时间】:2011-09-18 15:22:18
【问题描述】:
在另一个question 中,我询问了如何可视化存储在 SQL Server 数据库中的表中的分层数据。我找到了一种使用 GraphViz 可视化整个层次结构的方法,并在 T-SQL 和 Powershell 中使用了一些管道。
我想使用这样的可视化来调试使用类似数据的应用程序。对于小示例层次结构,可视化一切都很好。但在成千上万的层次结构中,这是压倒性的。
当我调试我的应用程序时,我通常只查看与给定节点相关的一小部分节点。目前,对于给定节点而言,对我而言唯一重要的相关节点是后代和祖先,以及节点本身。
所以,我想要一种方法来仅可视化层次结构中作为给定节点的后代、祖先或自身的节点。
以下语句创建链接问题中的示例数据库和表。
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
);
以下语句使用国家、城市和场所层次结构的修改版本填充表格。英国现在是根节点,有更多节点代表英国著名场馆。
INSERT INTO NodeHierarchy(PK_NodeID, FK_ParentNodeID, Name)
VALUES
(1, 18, N'Scotland'),
(2, 1, N'Glasgow'),
(3, 1, N'Edinburgh'),
(4, 1, N'St Andrews'),
(5, 2, N'The Barrowlands'),
(6, 2, N'The Cathouse'),
(7, 2, N'Carling Academy'),
(8, 2, N'SECC'),
(9, 2, N'King Tut''s Wah-Wah Hut'),
(10, 3, N'Henry''s Cellar Bar'),
(11, 3, N'The Bongo Club'),
(12, 3, N'Sneaky Pete''s'),
(13, 3, N'The Picture House'),
(14, 3, N'Potterrow'),
(15, 4, N'Aikman''s'),
(16, 4, N'The Union'),
(17, 4, N'Castle Sands'),
(18, NULL, N'United Kingdom'),
(19, 15, N'Upstairs'),
(20, 15, N'Downstairs'),
(21, 16, N'Venue 1'),
(22, 16, N'Venue 2'),
(23, 18, N'England'),
(24, 23, N'Manchester'),
(25, 24, N'Apollo Theatre'),
(26, 18, N'Liverpool'),
(27, 26, N'Cavern Club');
下图是链接问题中列出的 Powershell 脚本generate-graph.ps1 的输出。如果 Stack Overflow 缩小版看起来很难看,请查看 full-size image。
我只想看看圣安德鲁斯的后裔和祖先与它的关系。该图包含许多与这些关系无关的信息,因此更难阅读。当我将层次结构扩展到覆盖全球城市和场所的数千个节点时,完整的可视化几乎变得毫无用处。
在Freemind 中,我画了一张我希望看到的粗略图表:
如何仅提取与 St Andrews 相关的数据,以便将其提供给 GraphViz?
【问题讨论】:
-
这是一个危险的问题。我已经有了自己的解决方案,但我也想分享它解决的问题。我很快就会发布我自己的解决方案。
-
你使用的是 sql server 2008 吗?
-
我使用的是 SQL Server 2008。顺便说一句,我没有忘记发布我的解决方案;我最近很忙!
-
我正在走一条路,但没有成功...现在尝试其他方法:)
标签: sql-server tsql visualization hierarchical-data