2011-08-18 22 views
9

Esiste uno strumento che funzioni con SQL Server per generare diagrammi ad albero da un modello di dati gerarchico?Quale strumento genera diagrammi dai dati gerarchici di SQL Server?

Sto lavorando con una grande gerarchia geografica e vorrei visualizzarlo.

Ecco un esempio.

Ho una tabella NodeHierarchy che memorizza una relazione gerarchica tra i nodi. Ogni riga nella tabella rappresenta un nodo. Ogni nodo ma uno ha un nodo genitore. Il nodo che non ha genitore è la radice se la gerarchia.

Ecco come Creo il mio tavolo:

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 
); 

Ho un esempio gerarchia delle città scozzesi e locali. La Scozia è la radice della gerarchia. I discendenti della Scozia sono città e luoghi. In questa ricerca, un genitore "contiene" un bambino, quindi diciamo che ad es. "The Barrowlands è a Glasgow e Glasgow è in Scozia".

Questa affermazione popola la tabella NodeHierachy con i dati eample:

INSERT INTO NodeHierarchy(PK_NodeID, FK_ParentNodeID, Name) 
VALUES 
    (1, NULL, 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'); 

uscita di 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) 

In Freemind ho disegnato questo diagramma equivalente: mindmap of Scottish venues

Quale strumento può fare questo per me con un minimo di sforzo manuale?


EDIT: Originariamente ho detto che avrei voluto di visualizzare "tutto o in parte" della gerarchia. La soluzione pubblicata qui visualizza l'intera gerarchia incondizionatamente. Questo va bene per la piccola gerarchia di esempi, ma per uno più grande, può essere più utile visualizzarne solo una parte.

Perché non ho specificato cosa intendevo per "parte", l'ho rimosso dalla domanda. Ho chiesto informazioni sulla visualizzazione parziale in another question.

+0

+1 Questa è una bella domanda. Mi piacerebbe anche conoscere la risposta. –

+0

+1 Mi piace molto che tu abbia incluso 'CREATE DATABASE' e' INSERT' per poter tagliare e incollare! –

+0

Grazie, Kirk. È nello spirito dell '"esempio breve, autonomo, corretto, compilabile": http://sscce.org/. –

risposta

6

Ho ricercato i lead nella risposta di Cade Roux e sviluppato una soluzione utilizzando GraphViz.

Per comprendere GraphViz, prima ho letto questo introductory article e la documentazione Command-line Invocation. Dopo aver generato con successo grafici dall'elenco di codici di esempio nell'articolo, mi sono sentito sicuro di lavorare con i miei dati.

Come suggerito da Cade, il modo migliore per imparare il linguaggio DOT di GraphViz è di scriverlo da solo. Ho studiato gli esempi del articolo (Offerte 1, 2 e 6) e poi si avvicinò con questo venues.gv per descrivere il mio propri dati:

digraph Venues 
{ 
    N1[label = "Scotland"]; 
    N2[label = "Glasgow"]; 
    N3[label = "Edinburgh"]; 
    N4[label = "St Andrews"]; 
    N5[label = "The Barrowlands"]; 
    N6[label = "The Cathouse"]; 
    N7[label = "Carling Academy"]; 
    N8[label = "SECC"]; 
    N9[label = "King Tut's Wah-Wah Hut"]; 
    N10[label = "Henry's Cellar Bar"]; 
    N11[label = "The Bongo Club"]; 
    N12[label = "Sneaky Pete's"]; 
    N13[label = "The Picture House"]; 
    N14[label = "Potterrow"]; 
    N15[label = "Aikman's"]; 
    N16[label = "The Union"]; 
    N17[label = "Castle Sands"]; 

    N1 -> N2; 
    N1 -> N3; 
    N1 -> N4; 
    N2 -> N5; 
    N2 -> N6; 
    N2 -> N7; 
    N2 -> N8; 
    N2 -> N9; 
    N3 -> N10; 
    N3 -> N11; 
    N3 -> N12; 
    N3 -> N13; 
    N3 -> N14; 
    N4 -> N15; 
    N4 -> N16; 
    N4 -> N17; 
} 

ho dato da mangiare questo per circo, solo uno dei molti comandi grafico-disegno che sono parte di GraphViz, ed ha ottenuto l'uscita gradevole:

uscita di circo -Tpng venues.gv -o venues.png:

Visualization of hierarchical venue data

Il file GraphViz è strutturato in due blocchi. Un blocco dichiara un'etichetta per ogni nodo e l'altro blocco dichiara i bordi del grafico.

Per fornire i dati per ciascuno di questi blocchi, ho creato una vista di NodeHierarchy.

Questa visualizzazione fornisce i dati di dichiarare etichette per i nodi:

CREATE VIEW NodeLabels (
    Node, 
    Label 
) 
AS 
SELECT 
    PK_NodeID AS Node, 
    Name AS Label 
FROM 
    NodeHierarchy; 

Questa visualizzazione fornisce i dati di dichiarare bordi tra i nodi:

CREATE VIEW Edges (
    Parent, 
    Child 
) 
AS 
SELECT 
    FK_ParentNodeID AS Parent, 
    PK_NodeID AS Child 
FROM NodeHierarchy 
WHERE FK_ParentNodeID IS NOT NULL; 

Questo script Powershell chiamato generate-graph.ps1 seleziona i dati dal visualizzazioni, lo trasforma in un input GraphViz e lo invia a circo per produrre una visualizzazione della gerarchia completa come quella riportata sopra:

Lo script deve essere eseguito in sqlps anziché powershell in modo che sia disponibile il cmdlet Invoke-Sqlcmd. La directory di lavoro predefinita di sqlps è SQLSERVER, quindi devo specificare l'unità quando eseguo lo script tramite sqlps.

Questo è il comando che uso per generare un grafico come quello qui sopra:

sqlps C:.\generate-graph.ps1 

Questo genera un file chiamato venues.png nella directory di lavoro C.

Questa soluzione Powershell si sente un po 'poco elegante, ma questo è ciò che mi serve. Un programmatore Powershell più esperto potrebbe essere in grado di trovare qualcosa di più pulito.

+0

Questo visualizza solo l'intera gerarchia. Per il mio piccolo campione di dati, va bene, ma per una serie più ampia di dati potrei voler esaminare solo una piccola parte della gerarchia. Pubblicherò una soluzione aggiornata che lo rende possibile. –

7

Esportalo ed eseguilo tramite GraphViz - non devi nemmeno generare la gerarchia (esporti solo nodi e spigoli) - assegna solo nomi nodo che sono univoci in base alla colonna NodeID e utilizzano gli stessi nomi nodo nei bordi .

Se si desidera qualcosa di interattivo, Microsoft ha uno Automatic Graph Layout library che può essere utilizzato da .NET.

Ecco uno introduction to GraphViz.

Quello che devi fare è produrre un file DOT esportando il tuo SQL usando uno script come questo: http://data.stackexchange.com/stackoverflow/q/109885/ che scorrerà attraverso GraphViz e genererà la tua immagine.

la sintassi punto è relativamente semplice - è possibile scrivere a mano e poi generare tale da SQL e semplicemente incollarlo in un file o qualcos'altro (come .NET o PowerShell) che legge i set di SQL e genera il file .

È possibile automatizzarlo con SSIS.Ho creato un pacchetto che ha scritto il file DOT e ha eseguito graphviz su di esso e salvato un'istantanea graphiacl del nostro sistema su base giornaliera.

+0

Non ho familiarità con GraphViz e non so cosa intendi con 'esportazione'. Puoi spiegare il processo in modo più dettagliato? Grazie! –

+0

@isme Ho aggiunto altri puntatori –

+0

Ho letto l'introduzione, scritta nel 2004. La versione 2.28 di GraphViz produce diversi output su alcuni degli elenchi di codici dalla versione utilizzata dall'autore, ma funzionano ancora e sono un ottimo apprendimento aiuti. Grazie! –

Problemi correlati