2009-02-25 13 views
7

में पदानुक्रम डेटा को संभालना मुझे पता है कि पदानुक्रमों को संभालने का सबसे अच्छा तरीका (सर्वोत्तम अभ्यास) डाटाबेस डिज़ाइन के संबंध में क्या है। यहां एक छोटा उदाहरण है कि मैं आमतौर पर उन्हें कैसे संभालता हूं।डेटाबेस

नोड तालिका

NodeId int PRIMARY KEY 
NodeParentId int NULL 
DisplaySeq int NOT NULL 
Title nvarchar(255) 

पूर्वज टेबल

NodeId int 
AncestorId int 
Hops int 
NodeId, AncestorId पर इंडेक्स साथ

, होप्स

टेबल्स इस तरह दिखेगा:

नोड तालिका

NodeId NodeParentId DisplaySeq Title 
1   NULL   1    'Root' 
2   1    1    'Child 1' 
3   1    2    'Child 2' 
4   2    1    'Grandchild 1' 
5   2    2    'Grandchild 2' 

पूर्वज टेबल

NodeId AncestorId Hops 
1   NULL   0 
1   1    0 
2   1    1 
2   2    0 
3   1    1 
3   3    0 
4   1    2 
4   2    1 
4   4    0 
5   1    2 
5   2    1 
5   5    0 
इस डिजाइन के साथ

, मैंने पाया है कि बड़े पदानुक्रम के साथ मैं पर शामिल होने से बहुत जल्दी पदानुक्रम के एक पूरा खंड प्राप्त कर सकते हैं AncestorId = लक्ष्य NodeId के लिए पूर्वज तालिका, जैसे:

SELECT * 
FROM Node n 
INNER JOIN Ancestor a on a.NodeId=n.NodeId 
WHERE a.AncestorId = @TargetNodeId 

यह भी ई है asy प्रत्यक्ष बच्चों के साथ

SELECT * 
FROM Node n 
INNER JOIN Ancestor a on a.NodeId=n.NodeId 
WHERE a.AncestorId = @TargetNodeId 
AND Hops = 1 

मैं जानते हुए भी क्या अन्य समाधान आप बात के इस प्रकार के लिए इस्तेमाल किया हो सकता है में दिलचस्पी रखता हूँ मिलता है। मेरे अनुभव में, पदानुक्रम बहुत बालों वाले हो सकते हैं, और उनके पुनर्प्राप्ति को अनुकूलित करने का कोई भी तरीका बहुत महत्वपूर्ण है।

उत्तर

4

MarkusQ और n8wrl पहले ही बताया है के रूप में, जो सेलको इस पर कुछ अच्छी चीजें हैं।मैं बस इतना जोड़ूंगा कि पदानुक्रम का मॉडल करने के कई तरीके हैं (जो की पुस्तक में कई लोग हैं जो मुझे विश्वास है, केवल इतना नहीं कि वह "सर्वश्रेष्ठ" मानता है)। आपका अंतिम निर्णय उम्मीद है कि आपकी अपनी विशिष्ट जरूरतों को ध्यान में रखेगा। इसे मॉडल करने के विभिन्न तरीकों में से कुछ लिखने-गहन संचालन के लिए बेहतर हैं जबकि अन्य पदानुक्रम को लगातार और तेज़ पढ़ने के लिए बेहतर होते हैं। बस ध्यान रखें कि आपका सिस्टम इसके साथ क्या कर रहा है।

10

यह करने के लिए कुछ विक्रेता विशिष्ट एक्सटेंशन होते हैं, लेकिन मेरी पसंदीदा db-निष्पक्ष तरीके से जो सेलको से आता है - google 'जो सेलको पेड़ों और पदानुक्रम' या यह पुस्तक खरीद: link text

यह एक बहुत ही चालाक है जाने के लिए सेट-आधारित तरीका। पदानुक्रम पूछना आसान है। मैंने आपके पास 'parentID' फ़ील्ड जोड़ा है क्योंकि मैं 'प्रत्यक्ष बच्चों' और 'अभिभावक' प्रश्नों से बहुत कुछ पूछता हूं और जो उन्हें गति देता है। लेकिन यह 'वंश' या 'अवरोही' क्वेरी पाने का एक शानदार तरीका है।

6

तुम भी "नेस्ट सेट" पैटर्न की जाँच कर सकते हैं:

http://www.intelligententerprise.com/001020/celko.jhtml (ब्रोकन लिंक)

या आप अधिक के लिए गूगल कर सकते हैं।

पीएस .: शापित, n8wrl, आप मुझसे जितना तेज़ टाइप करते हैं!

+0

नेस्टेड सेट! यही वह शब्द है जिसे मैं ढूंढ रहा था! – n8wrl

+0

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

+0

आप करते हैं। और यही वह जगह है जहां टॉम एच का जवाब इतना महत्वपूर्ण है। मेरे लिए, यह पदानुक्रमों पर आश्चर्यजनक रूप से काम करता है, मेरे पास यह बदलाव बहुत कम है। – n8wrl

1

ओरेकल में, आप पदानुक्रमित डेटा पूछने के लिए कनेक्ट/स्टार्ट के साथ कनेक्ट का उपयोग कर सकते हैं। SQL सर्वर में, आप एक संग्रहित प्रक्रिया का उपयोग कर सकते हैं, जो स्वयं को रिकर्सिव रूप से कॉल करता है।

+0

मैंने रिकर्सिव कॉल का उपयोग किया है लेकिन क्वेरी बहुत धीमी गति से चलती है, इसलिए मैंने पूर्वजों की तालिका को लागू किया, इसलिए मैं एक रिकर्सिव कॉल से दूर हो सकता था। –