2011-08-18 6 views
9

क्या कोई उपकरण है जो एक पदानुक्रमित डेटा मॉडल से पेड़ की तरह आरेख उत्पन्न करने के लिए SQL सर्वर के साथ काम करता है?कौन सा टूल SQL सर्वर पदानुक्रमित डेटा से आरेख उत्पन्न करता है?

मैं एक बड़े भौगोलिक पदानुक्रम के साथ काम कर रहा हूं, और इसे कल्पना करना चाहता हूं।

यहां एक उदाहरण है।

मेरे पास एक नोड हाइरार्ची तालिका है जो नोड्स के बीच एक पदानुक्रमिक संबंध रखती है। तालिका में प्रत्येक पंक्ति एक नोड का प्रतिनिधित्व करता है। प्रत्येक नोड लेकिन एक माता पिता नोड है। पदानुक्रम अगर कोई माता पिता नहीं है तो जड़ है।

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

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 में मैं इस बराबर आरेख आकर्षित किया: mindmap of Scottish venues

क्या उपकरण कर सकते हैं

यह बयान eample डेटा के साथ NodeHierachy तालिका भरता है कम से कम मैन्युअल प्रयास के साथ यह मेरे लिए?


संपादित करें: मूल रूप से मैंने कहा कि मैं पदानुक्रम के "सब कुछ या हिस्सा" कल्पना करने के लिए करना चाहता था। यहां पोस्ट किया गया समाधान पूरे पदानुक्रम को बिना शर्त रूप से देखता है। यह छोटे उदाहरण पदानुक्रम के लिए ठीक है, लेकिन एक बड़े के लिए, यह केवल इसके हिस्से को देखने के लिए और अधिक उपयोगी हो सकता है।

क्योंकि मैंने यह निर्दिष्ट नहीं किया कि मेरा "भाग" से क्या मतलब है, मैंने इसे प्रश्न से हटा दिया है। मैंने another question में आंशिक दृश्यता के बारे में पूछा है।

+0

+1 यह एक अच्छा सवाल है। मैं भी जवाब जानना चाहता हूं। –

+0

+1 मुझे वास्तव में यह पसंद है कि आपने 'डाटाबेस बनाएं' और 'INSERT' शामिल किया है, इसलिए मैं कट और पेस्ट कर सकता हूं! –

+0

धन्यवाद, किर्क। यह 'संक्षिप्त, आत्मनिर्भर, सही, संकलित उदाहरण' के स्पिट में है: http://sscce.org/। –

उत्तर

6

मैंने कैड रूक्स के जवाब में लीड की खोज की और ग्राफवीज़ का उपयोग करके एक समाधान विकसित किया।

ग्राफ़विज़ को समझने के लिए, पहले मैंने इसे introductory article और Command-line Invocation दस्तावेज़ पढ़ा। लेख में उदाहरण कोड सूची से आलेखों को सफलतापूर्वक उत्पन्न करने के बाद, मुझे अपने डेटा के साथ काम करने के लिए आत्मविश्वास महसूस हुआ।

जैसा कि केड ने सुझाव दिया था, ग्राफ़विज़ की डीओटी भाषा सीखने का सबसे अच्छा तरीका यह है कि इसे स्वयं लिखना है। मैं लेख के उदाहरण का अध्ययन (लिस्टिंग 1, 2, और 6) और फिर अपने खुद के डेटा का वर्णन करने के लिए इस venues.gv के साथ आया था:

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

मैं circo को यह तंग आ गया, बस कई ग्राफ-ड्राइंग आदेशों में से एक है कि Graphviz का हिस्सा हैं, और मनभावन उत्पादन मिल गया:

circo -Tpng venues.gv -o venues.png के आउटपुट:

Visualization of hierarchical venue data

Graphviz फ़ाइल दो ब्लॉकों में संरचित है। एक ब्लॉक प्रत्येक नोड के लिए एक लेबल घोषित करता है, और अन्य ब्लॉक ग्राफ के किनारों की घोषणा करता है।

इन ब्लॉकों में से प्रत्येक के लिए डेटा प्रदान करने के लिए, मैंने NodeHierarchy का एक दृश्य बनाया।

यह दृश्य नोड्स के लिए लेबल की घोषणा करने के डेटा प्रदान करता है:

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

यह PowerShell स्क्रिप्ट generate-graph.ps1 कहा जाता है से डेटा का चयन करता है:

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

यह दृश्य नोड्स के बीच किनारों घोषित करने के लिए डेटा प्रदान करता है विचार, इसे ग्राफ़विज़ इनपुट में बदल देता है, और इसे उपरोक्त की तरह पूर्ण पदानुक्रम के विज़ुअलाइज़ेशन का उत्पादन करने के लिए circo पर पाइप करता है:

"digraph Venues {" + (
    Invoke-Sqlcmd -Query "SELECT * FROM HierarchyTest.dbo.NodeLabels" | 
    ForEach-Object {"N" + $_.Node + "[label = """ + $_.Label + """];"} 
) + (
    Invoke-Sqlcmd -Query "SELECT * FROM HierarchyTest.dbo.Edges" | 
    ForEach-Object {"N" + $_.Parent + " -> N" + $_.Child + ";"} 
) + 
"}" | circo -Tpng -o venues.png 

स्क्रिप्ट powershell के बजाय sqlps में चलनी चाहिए ताकि Invoke-Sqlcmd cmdlet उपलब्ध हो। sqlps की डिफ़ॉल्ट कार्य निर्देशिका SQLSERVER है, इसलिए जब मैं sqlps के माध्यम से स्क्रिप्ट चलाता हूं तो मुझे ड्राइव निर्दिष्ट करना होगा।

sqlps C:.\generate-graph.ps1 

यह एक फ़ाइल सी काम कर निर्देशिका में venues.png बुलाया आउटपुट:

यह आदेश मैं उपरोक्त के समान एक ग्राफ उत्पन्न करने के लिए इस्तेमाल करते हैं।

यह पावरहेल समाधान थोड़ा सा सुरुचिपूर्ण लगता है, लेकिन ऐसा करने के लिए मुझे यह करने की ज़रूरत है। एक अधिक अनुभवी पावरहेल प्रोग्रामर कुछ क्लीनर के साथ आने में सक्षम हो सकता है।

+0

यह केवल पूरे पदानुक्रम को देखता है। डेटा के मेरे छोटे नमूना सेट के लिए, यह ठीक है, लेकिन डेटा के एक बड़े सेट के लिए मैं पदानुक्रम का केवल एक छोटा सा हिस्सा देखना चाहता हूं। मैं एक अद्यतन समाधान पोस्ट करूंगा जो इसे संभव बनाता है। –

7

निर्यात करें और इसे GraphViz के माध्यम से चलाएं - आपको पदानुक्रम (केवल नोड्स और किनारों को निर्यात करें) उत्पन्न करने की आवश्यकता नहीं है - केवल नोड नाम असाइन करें जो आपके नोडिड कॉलम पर आधारित अद्वितीय हैं और किनारों में उन नोड नामों का उपयोग करें ।

यदि आप कुछ इंटरैक्टिव चाहते हैं, तो माइक्रोसॉफ्ट के पास Automatic Graph Layout library है जिसका उपयोग .NET से किया जा सकता है।

यहां एक introduction to GraphViz है।

आप जो करने जा रहे हैं वह इस तरह की एक स्क्रिप्ट का उपयोग करके अपने एसक्यूएल को निर्यात करके एक डीओटी फ़ाइल आउटपुट कर रहा है: http://data.stackexchange.com/stackoverflow/q/109885/ जो ग्राफ़विज़ के माध्यम से चलाएगा और आपकी तस्वीर उत्पन्न करेगा।

डीओटी वाक्यविन्यास अपेक्षाकृत सरल है - आप इसे पहले हाथ से लिख सकते हैं और उसके बाद इसे SQL से उत्पन्न कर सकते हैं और इसे किसी फ़ाइल या किसी अन्य चीज़ (जैसे .NET या PowerShell) में पेस्ट कर सकते हैं जो SQL सेट पढ़ता है और फ़ाइल उत्पन्न करता है ।

आप एसएसआईएस के साथ इसे स्वचालित कर सकते हैं।मैंने एक पैकेज बनाया जिसने डीओटी फाइल लिखी और उस पर ग्राफविज़ चलाया और दैनिक आधार पर हमारे सिस्टम का ग्राफिकल स्नैपशॉट बचाया।

+0

मैं ग्राफवीज़ से परिचित नहीं हूं, और मुझे नहीं पता कि आप 'निर्यात' से क्या मतलब रखते हैं। क्या आप प्रक्रिया को और विस्तार से समझा सकते हैं? धन्यवाद! –

+0

@isme मैंने कुछ और पॉइंटर्स –

+0

जोड़ा है, मैंने 2004 में लिखा परिचय पढ़ा। ग्राफविज़ का संस्करण 2.28 लेखक द्वारा उपयोग किए गए संस्करण से कुछ कोड लिस्टिंग पर अलग-अलग आउटपुट उत्पन्न करता है, लेकिन वे अभी भी काम करते हैं और एक महान सीख रहे हैं सहायता। धन्यवाद! –

संबंधित मुद्दे

 संबंधित मुद्दे