2012-04-29 15 views
9

में क्वेरी मैं एक मेज Person कि 3 स्तंभ है।ट्री संरचना डेटा एसक्यूएल सर्वर

वर्तमान में, पूरे पेड़ को प्रदर्शित करने के लिए, इसे तब तक सभी बाल तत्वों के माध्यम से लूप करना होगा जब तक कि कोई और बाल तत्व न हो। यह बहुत कुशल प्रतीत नहीं होता है।

क्या इस डेटा को पूछने के लिए एक बेहतर और अधिक प्रभावी तरीका है?

साथ ही, क्या इस पेड़ को SQL सर्वर डेटाबेस में संरचना जैसे प्रतिनिधित्व करने का एक बेहतर तरीका है? मेरी तालिका/डेटाबेस के लिए एक वैकल्पिक डिजाइन?

+0

उत्तर के साथ समान प्रश्न के लिए http://stackoverflow.com/questions/935098/database- संरचना-for-tree-data- संरचना देखें। – JeremyDWill

+1

बिल करविन के [एसक्यूएल एंटीपार्टर्नस हड़ताल वापस देखें] (http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back) स्लाइड डेक - वह कई एंटीपार्टर्न का वर्णन करता है - उनमें से "बेवकूफ पेड़" है जो आपके पास है - और इसके लिए संभावित समाधान प्रदान करता है। उनके पास एक ही नाम [एसक्यूएल एंटीपाटरर्न] (http://pragprog.com/book/bksqla/sql-antipatterns) द्वारा एक महान पुस्तक है - अत्यधिक अनुशंसित! –

उत्तर

17

मुझे नहीं लगता कि डिजाइन के साथ कुछ भी गलत है, मान लीजिए कि आपके पास माता-पिता के रिश्तों का सीमित स्तर है। यहाँ रिश्ते को पुन: प्राप्त एक पुनरावर्ती CTE का उपयोग करने का एक त्वरित उदाहरण है:

USE tempdb; 
GO 

CREATE TABLE dbo.tree 
(
    ID INT PRIMARY KEY, 
    name VARCHAR(32), 
    ParentID INT FOREIGN KEY REFERENCES dbo.tree(ID) 
); 

INSERT dbo.tree SELECT 1, 'grandpa', NULL 
UNION ALL SELECT 2, 'dad', 1 
UNION ALL SELECT 3, 'me', 2 
UNION ALL SELECT 4, 'mom', 1 
UNION ALL SELECT 5, 'grandma', NULL; 

;WITH x AS 
(
    -- anchor: 
    SELECT ID, name, ParentID, [level] = 0 
    FROM dbo.tree WHERE ParentID IS NULL 
    UNION ALL 
    -- recursive: 
    SELECT t.ID, t.name, t.ParentID, [level] = x.[level] + 1 
    FROM x INNER JOIN dbo.tree AS t 
    ON t.ParentID = x.ID 
) 
SELECT ID, name, ParentID, [level] FROM x 
ORDER BY [level] 
OPTION (MAXRECURSION 32); 
GO 

भूल को साफ करने नहीं है:

DROP TABLE dbo.tree; 

This might be a useful article. एक वैकल्पिक hierarchyid है लेकिन मैं इसे बहुत ज्यादा सबसे परिदृश्यों के लिए जटिल लगता है ।

+1

यह आपके पेड़ की संरचना के अनुसार विषय के लिए प्रासंगिक नहीं है, लेकिन आपकी 'माँ' और 'पिता' भाई बहन नहीं हैं? :) मेरा मतलब है दैनिक दैनिक अर्थ, जैसे उनके पास एक ही पिता है। ओह, –

+0

@ वारवरा हाँ, कभी भी ध्यान न दें। –

4

हारून बर्ट्रैंड्स उत्तर सामान्य मामले के लिए बहुत अच्छा है। यदि आपको केवल एक बार में पूरे पेड़ को प्रदर्शित करने की आवश्यकता है, तो आप केवल पूरी तालिका से पूछ सकते हैं और पेड़-निर्माण में मेमोरी कर सकते हैं। यह अधिक सुविधाजनक और लचीला होने की संभावना है। प्रदर्शन भी थोड़ा बेहतर होगा (पूरी तालिका को वैसे भी डाउनलोड करने की आवश्यकता है और सी # SQL सर्वर की तुलना में ऐसी गणना के लिए तेज़ है)।

यदि आपको केवल पेड़ के एक हिस्से की आवश्यकता है तो इस विधि की अनुशंसा नहीं की जाती है क्योंकि आप आवश्यकतानुसार अधिक डेटा डाउनलोड करेंगे।

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