2009-06-01 26 views
125

डेटाबेस में पेड़ डेटा संरचना को अनुकूलन (अर्थात्, एक अज्ञात संख्या के साथ एक वृक्ष संरचना) लागू करने का सबसे अच्छा तरीका क्या होगा?वृक्ष डेटा संरचना के लिए डेटाबेस संरचना

मैंने एक बार एक विदेशी कुंजी के साथ एक टेबल का उपयोग करने से पहले यह किया है।

आप अन्य कार्यान्वयन क्या देख सकते हैं, और क्या यह कार्यान्वयन समझ में आता है?

+3

देखें: [रिलेशनल डेटाबेस में पदानुक्रमित डेटा संग्रहीत करने के विकल्प क्या हैं?] (Http://stackoverflow.com/questions/4048151/what-are-the- विकल्प-for-storing-hierarchical-data-in -ए-रिलेशनल-डेटाबेस) – cbare

+0

एसक्यूएल सर्वर (2008 के बाद से) [पदानुक्रमित डेटा प्रकार] (https://msdn.microsoft.com/en-us/library/bb677290.aspx) – BornToCode

उत्तर

63

आप का उल्लेख है, सबसे अधिक लागू किया जो संलग्नता सूची है: https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets

वहाँ अन्य मॉडलों materialized पथ और नेस्टेड सेटों सहित रूप में अच्छी तरह कर रहे हैं,: http://communities.bmc.com/communities/docs/DOC-9902

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

इसके अलावा, इट्ज़िक बेन-गैन के पास "पुस्तक माइक्रोसॉफ्ट एसक्यूएल सर्वर 2005: टी-एसक्यूएल क्वेरीिंग" के सबसे आम विकल्पों का एक अच्छा अवलोकन है।

मुख्य बातों जब एक मॉडल को चुनने पर विचार करने के लिए कर रहे हैं:

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

2) क्या पेड़ लिखना भारी या पठनीय है - कुछ संरचना संरचना को पढ़ने के दौरान बहुत अच्छी तरह से काम करती है, लेकिन संरचना को लिखते समय अतिरिक्त ओवरहेड लेती है।

3) संरचना से प्राप्त करने के लिए आपको किस प्रकार की जानकारी की आवश्यकता है - कुछ संरचनाएं संरचना के बारे में कुछ प्रकार की जानकारी प्रदान करने में उत्कृष्ट हैं। उदाहरणों में नोड और उसके सभी बच्चों को ढूंढना, नोड और उसके सभी माता-पिता को ढूंढना, कुछ स्थितियों को पूरा करने वाले बाल नोड्स की गिनती आदि शामिल करना शामिल है।आपको यह जानने की जरूरत है कि संरचना से निर्धारित करने के लिए संरचना से कौन सी जानकारी की आवश्यकता होगी जो आपकी आवश्यकताओं के अनुरूप सर्वोत्तम होगा।

+0

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

+1

पहला लिंक टूटा हुआ प्रतीत होता है। –

+0

@ जे। सी Leitão - धन्यवाद, मैंने लिंक अद्यतन किया है। – JeremyDWill

48

Managing Hierarchical Data in MySQL पर एक नज़र डालें। यह एक संबंधपरक डेटाबेस में पदानुक्रमित (पेड़ की तरह) डेटा को संग्रहित और प्रबंधित करने के लिए दो दृष्टिकोणों पर चर्चा करता है।

पहला दृष्टिकोण आसन्नता सूची मॉडल है, जो आप अनिवार्य रूप से वर्णन करते हैं: एक विदेशी कुंजी जो तालिका को संदर्भित करती है। हालांकि यह दृष्टिकोण सरल है, यह पूरे पेड़ के निर्माण जैसे कुछ प्रश्नों के लिए बहुत अक्षम हो सकता है।

लेख में चर्चा की गई दूसरी दृष्टिकोण नेस्टेड सेट मॉडल है। यह दृष्टिकोण कहीं अधिक कुशल और लचीला है। विस्तृत स्पष्टीकरण और उदाहरण प्रश्नों के लिए आलेख का संदर्भ लें।

+0

प्रदान करता है आपके लिंक में एक बहुत ही रोचक विषय है विचार - विमर्श किया जा रहा है। धन्यवाद! – Fritz

2

एक विदेशी कुंजी के साथ एक टेबल रखने से मुझे समझ में आता है।

फिर आप एसक्यूएल में एक सामान्य तालिका अभिव्यक्ति का उपयोग कर सकते हैं या अपने पेड़ को बनाने के लिए ओरेकल में पूर्व कथन से कनेक्ट कर सकते हैं।

+0

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

+0

@ केएम - उन्होंने कहा "समझ में आता है" नहीं "समझ में नहीं आता" –

2

तैयार की बढ़िया संग्रह एसक्यूएल सर्वर पर निम्न कार्यान्वयन का उपयोग किया है कार्य करता है जो निकटता सूची मॉडल के साथ इस्तेमाल किया जा सकता जीवन को सरल बनाने के लिए उपयोग करने के लिए।

http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html

8

आप तो पेड़ डेटा संरचना को व्यवस्थित करने के Postgresql शांत ltree मॉड्यूल है कि एक पदानुक्रमित पेड़ की तरह संरचना में संग्रहीत डेटा के लेबल का प्रतिनिधित्व करने के लिए डेटा प्रकार प्रदान करता है संबंधपरक डेटाबेस का उपयोग करने के है। आप वहां से विचार प्राप्त कर सकते हैं। (अधिक जानकारी के लिए देखें: http://www.postgresql.org/docs/9.0/static/ltree.html)

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

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