ट्री डेटा संरचना के लिए डेटाबेस संरचना


151

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

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

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



SQL सर्वर (2008 के बाद से) पदानुक्रम डेटा प्रकार
BornToCode

जवाबों:


80

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

भौतिक मॉडल और नेस्टेड सेट सहित अन्य मॉडल भी हैं: http://communities.bmc.com/communities/docs/DOC-9902

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

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

मॉडल चुनते समय विचार करने वाली मुख्य बातें हैं:

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

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

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


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

1
पहली कड़ी टूटी हुई लगती है।
जॉर्ज लेइताओ

बहुत बढ़िया जवाब। धन्यवाद @JeremyDWill!
बॉबोकॉपी

56

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

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

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


आपके लिंक पर एक बहुत ही दिलचस्प विषय पर चर्चा की जा रही है। धन्यवाद!
फ्रिट्ज़

9

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

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


2

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

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


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

@ केएम - उन्होंने कहा कि "समझदारी नहीं है" "समझदारी नहीं है"
जॉन रस


1

मैं एसक्यूएल सर्वर पर निम्न कार्यान्वयन का उपयोग किया है 2005 चेक यहाँ


0

यदि कोई इस प्रश्न पर MS SQL Server 2008 और उच्च भूमि का उपयोग कर रहा है : SQL Server 2008 और उच्चतर में एक नया "hierarchyId" फीचर है जिसे विशेष रूप से इस कार्य के लिए डिज़ाइन किया गया है।

Https://docs.microsoft.com/en-us/sql/relational-dat डेटाबेस/ hierarchical-data-sql- server पर अधिक जानकारी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.