2008-09-27 15 views
53

मैं डेटाबेस में निर्देशिका/पदानुक्रम/वृक्ष संरचना कैसे संग्रहीत करूं? अर्थात् एमएसएसक्यूएल सर्वर।डेटाबेस में निर्देशिका/पदानुक्रम/पेड़ संरचना को कैसे स्टोर करें?

@olavk: प्रतीत नहीं होता है जैसे आप अपने खुद के जवाब देखा है। जिस तरह से मैं का उपयोग जिस तरह से पुनरावर्ती प्रश्नों :)

p.p.s. से बेहतर है This is जाने का रास्ता!

+0

क्या आप वकालत कर रहे हैं "materialized पथ" एन्कोडिंग मॉडल है। यही कारण है कि दृष्टिकोण समझ करने के लिए आसान है, लेकिन कुछ कार्यों के लिए अक्षम है, को देखने के http://vadimtropashko.wordpress.com/2008/08/09/one-more-nested-intervals-vs-adjacency-list-comparison/ –

+2

यह एक है महान सवाल ... – anbanm

उत्तर

17

वहाँ many ways हैं SQL डेटाबेस में पदानुक्रम स्टोर करने के लिए। कौन सा चयन करना है, इस पर निर्भर करता है कि आप किस डीबीएमएस उत्पाद का उपयोग करते हैं, और डेटा का उपयोग कैसे किया जाएगा। जैसा कि आपने MSSQL2005 टैग का उपयोग किया है, मुझे लगता है कि आपको "एडजेंसी सूची" मॉडल पर विचार करना शुरू करना चाहिए; अगर आपको लगता है कि यह आपके आवेदन के लिए अच्छा प्रदर्शन नहीं करता है, तो Vadim Tropashko's comparison पर एक नज़र डालें जो कई प्रदर्शन विशेषताओं पर ध्यान केंद्रित करने वाले मॉडल के बीच अंतर को हाइलाइट करता है।

4

यह एक प्रश्न की तुलना में मेरे लिए एक बुकमार्क के और अधिक है, लेकिन यह आप भी मदद कर सकता है। मैंने डाटाबेस में निर्देशिका/पेड़ संरचना को स्टोर करने के लिए this article's दृष्टिकोण का उपयोग किया है।

रूप में अच्छी तरह लेख में कुछ उपयोगी कोड के टुकड़े कर रहे हैं।

उम्मीद है कि इससे मदद मिलती है।

मैं किसी भी तरह

3

आप SQL सर्वर 2005 का उपयोग कर रहे है कि वेबसाइट के साथ संबद्ध नहीं कर रहा हूँ? Recursive queries क्वेरी पदानुक्रमित डेटा को और अधिक सुरुचिपूर्ण बनाते हैं।

संपादित करें: मैं materialized पथ हैक का एक सा कर रहे हैं लगता है। पथ में गैर-सामान्यीकृत अनावश्यक डेटा होता है, और आपको उन्हें अद्यतन रखने के लिए ट्रिगर्स या कुछ का उपयोग करना होगा। उदाहरण के लिए। यदि कोई नोड पैरेंट बदलता है, तो पूरे उपट्री को अपने पथ अपडेट करना पड़ता है। और subtree प्रश्नों को एक सुरुचिपूर्ण और तेजी से शामिल होने के बजाय कुछ बदसूरत सबस्ट्रिंग मिलान का उपयोग करना है।

+0

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

1

विशिष्ट तरीका एक विदेशी कुंजी (जैसे, "ParentId") खुद पर के साथ एक मेज है।

4

वहाँ भी जो ParentID मॉडल पर कुछ फायदे हैं पेड़ की नेस्ट-सेट मॉडल है। देखें http://www.evanpetersen.com/item/nested-sets.html और http://falsinsoft.blogspot.nl/2013/01/tree-in-sql-database-nested-set-model.html

+0

@Ali - आपका लिंक भी टूटा हुआ है! – NightOwl888

+0

@ NightOwl888 हां, यह टूट गया है। मैंने बस 20 मिनट गुगल किया और इसे खोजने में असफल रहा ... इसलिए मैंने टूटी हुई लिंक के साथ टिप्पणी हटा दी। – Ali

+2

मैंने कुछ जवाब दिए गए लिंक –

8

तो Sql सर्वर 2008 का उपयोग कर एक विकल्प है: हो सकता है आप नए hierarchyid डेटा प्रकार की जांच करनी चाहिए।

+0

+1 के साथ अपना जवाब अपडेट कर दिया है। मैं बस इसका जिक्र करने वाला था! –

2

मैं अपनी परियोजनाओं में से एक के साथ इसी तरह की समस्या का सामना करना पड़ा। हमारे पास एक विशाल पदानुक्रम था जो हमेशा के लिए बढ़ता रहेगा। मुझे इसे तेजी से पार करने की आवश्यकता है और फिर कुछ जटिल सत्यापन के बाद सही समूह ढूंढना आवश्यक है। एसक्यूएल सर्वर पर जाने और मेरे सिर को खरोंच करने की बजाय मैं इसे कुशलतापूर्वक कैसे कर सकता हूं जब मुझे पता था कि रिकर्सिव प्रश्न केवल एक व्यवहार्य समाधान हैं। लेकिन क्या आप वास्तव में जानते हैं कि रिकर्सिव क्वेरीज़ में संभवतः कोई अनुकूलन है या नहीं। क्या कोई गारंटी है कि भविष्य में आपका पदानुक्रम बढ़ेगा और एक अच्छा दिन आपको पता चल जाएगा कि आपके रिकर्सिव प्रश्नों का उत्पादन उत्पादन में बहुत धीमा है?

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

आशा है कि आपको यह उपयोगी लगेगा।

2

सवाल this question कि बंद हो गया के समान है। मैं दोनों सवालों मेरा व्यवसाय में बहुत उपयोगी के लिए जवाब मिल गया है, और वे अंततः मुझे MongoDB मैनुअल कि वृक्ष संरचना मॉडल करने के लिए 5 अलग अलग तरीकों से प्रस्तुत करने के लिए नेतृत्व: https://docs.mongodb.com/manual/applications/data-models-tree-structures/

जबकि MongoDB एक संबंधपरक डेटाबेस नहीं है, प्रस्तुत मॉडल लागू होते हैं डेटाबेस को रिलेशनल करने के साथ-साथ जेएसओएन जैसे अन्य प्रारूपों के लिए। आपको स्पष्ट रूप से यह पता लगाने की आवश्यकता है कि कौन सा मॉडल प्रस्तुत पेशेवर/विपक्ष के आधार पर सही है।

इस सवाल के लेखक एक solution कि दोनों जनक संयुक्त और पथ मॉडल materialized पाया। गहराई और माता-पिता को बनाए रखने से कुछ समस्याएं हो सकती हैं (अतिरिक्त तर्क, प्रदर्शन), लेकिन कुछ ज़रूरतों के लिए स्पष्ट रूप से अपवाद हैं। मेरी प्रोजेक्ट के लिए, मटेरियलाइज्ड पाथ सबसे अच्छा काम करेंगे और मैंने this आलेख से तकनीकों के माध्यम से कुछ मुद्दों (सॉर्टिंग और पथ की लंबाई) को पार कर लिया है।

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