2010-03-16 12 views
7

मेरे पास एक वृक्ष संरचना है जो बिना किसी प्रतिबंध के एन-स्तर गहरे हो सकती है। इसका मतलब है कि प्रत्येक नोड में एक और एन नोड्स हो सकते हैं।संबंध मॉडल में पदानुक्रमित पेड़ों को संभालने के तरीके के बारे में कोई सुझाव?

डेटाबेस जैसे हजारों प्रश्नों को जारी किए बिना पेड़ को पुनर्प्राप्त करने का सबसे अच्छा तरीका क्या है?

मैंने कुछ अन्य मॉडल देखा, जैसे फ्लैट टेबल मॉडल, प्रीऑर्डर ट्री ट्रैवर्सल एल्गोरिदम, और इसी तरह।

क्या आपके पास कोई कुशल पेड़ मॉडल को कार्यान्वित करने के बारे में कोई सुझाव या सुझाव हैं? असली उद्देश्य में मेरा उद्देश्य एक या दो प्रश्न हैं जो मेरे लिए पूरे पेड़ को थूकेंगे।

पर्याप्त प्रसंस्करण के साथ मैं टॉट नेट में पेड़ प्रदर्शित कर सकता हूं, लेकिन यह क्लाइंट मशीन में होगा, इसलिए, एक बड़ा सौदा नहीं है।

ओह बस यहाँ कुछ अधिक जानकारी छोड़ने:

पर्यावरण: Oracle या PostgreSQL, C# और Winforms।

ध्यान के लिए धन्यवाद

+0

आप कहते हैं कि आपके पेड़ एन गहरे और एन चौड़े हो सकते हैं? आमतौर पर इसे एन गहरे और बी (शाखा कारक) के रूप में वर्णित किया जाता है। क्या 10 गहरे पेड़ में वास्तव में नोड्स हैं जो 10 बच्चे चौड़े हैं? बी बी * निश्चित * संख्या है? –

+0

हैलो ईरा। नहीं बी एक निश्चित संख्या नहीं है। सौदा यह है कि ए में एन श्रेणियां हो सकती हैं, और इनमें से प्रत्येक में अन्य एन श्रेणियां अनिश्चित काल तक हो सकती हैं। मैं यह भी मान रहा हूं कि यह पेड़ बहुत बड़ा नहीं होगा, लेकिन चूंकि हमारे पास कई उपयोगकर्ता हैं, सबसे सरल समाधान (प्रत्येक स्तर के लिए एक प्रश्न जारी करना) बहुत महंगा हो सकता है। –

उत्तर

0

अपने ही चिंता का विषय मानते हुए है चयन और नहीं आवेषण/अद्यतन/हटाता है, इस तरह के रूप में की जरूरत पर निर्भर करता है,:

  • आप को पता है कि स्तर प्रत्येक नोड पर है की जरूरत है?
  • क्या आपको यह जानने की ज़रूरत है कि प्रत्येक नोड में कोई प्रतिपादन करते समय कोई बच्चा है या नहीं?
  • क्या आपको भाई बहनों को नाम से सॉर्ट करने की आवश्यकता है?

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

संपादित करें:

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

जैसे,

CREATE TABLE [dbo].[MatPath](
    [ID] [int] NULL, 
    [Name] [varchar](50) NULL, 
    [Path] [varchar](max) NULL, 
    [SortPath] [varchar](max) NULL 
) 

insert into MatPath (ID, Name, Path, SortPath) values (1, 'Animal', '1', 'Animal-1') 
insert into MatPath (ID, Name, Path, SortPath) values (2, 'Dog', '1.2', 'Animal-1|Dog-2') 
insert into MatPath (ID, Name, Path, SortPath) values (3, 'Horse', '1.3', 'Animal-1|Horse-3') 
insert into MatPath (ID, Name, Path, SortPath) values (4, 'Beagle', '1.2.4', 'Animal-1|Dog-2|Beagle-4') 
insert into MatPath (ID, Name, Path, SortPath) values (5, 'Abyssinian', '1.3.5', 'Animal-1|Horse-3|Abyssinian-5') 
insert into MatPath (ID, Name, Path, SortPath) values (6, 'Collie', '1.2.6', 'Animal-1|Dog-2|Collie-6') 

select * 
from MatPath 
order by SortPath 

आउटपुट:

ID  Name   Path  SortPath 
------ --------------- ----------- -------------------------------- 
1  Animal   1   Animal-1 
2  Dog    1.2   Animal-1|Dog-2 
4  Beagle   1.2.4  Animal-1|Dog-2|Beagle-4 
6  Collie   1.2.6  Animal-1|Dog-2|Collie-6 
3  Horse   1.3   Animal-1|Horse-3 
5  Abyssinian  1.3.5  Animal-1|Horse-3|Abyssinian-5 

(6 row(s) affected) 

आप अनुप्रयोग परत में पाइप (या पूर्ण विराम) की गणना के द्वारा प्रत्येक नोड के स्तर को निर्धारित कर सकते हैं, या SQL में उपयोग करते हुए जो भी अंतर्निहित या कस्टम फ़ंक्शन जो count occurrences of a string कर सकते हैं।

इसके अलावा, आप देखेंगे कि बनाते समय Name पर ID संलग्न करें। यह सुनिश्चित करना है कि एक ही नाम के साथ दो भाई नोड हमेशा एक ही क्रम में वापस आ जाएंगे।

+0

हैलो ऑर्बैन। मुझे प्रत्येक के स्तर को जानने की ज़रूरत है :(और मुझे उन्हें नाम से क्रमबद्ध करने की आवश्यकता है। मुझे ऑर्डर देने के बारे में परवाह नहीं है। मैं पेड़ को स्मृति में बनाउंगा और फिर प्रस्तुत करने के लिए कहूंगा।: डी –

2

कोई कुशल पेड़ मॉडल नहीं है।

एसक्यूएल 2008 - पदानुक्रम। Hiearchies को संभालने के लिए एक नया डेटा प्रकार है, लेकिन यह समय के साथ बड़ा हो जाता है।

या: सामान्य। तालिका में अभिभावक क्षेत्र, अभिभावक तालिका की आईडी को इंगित करता है।

प्रश्नों के लिए ...

  • आप क्या कर सकते हैं कि एक छोटे से अधिक बेहतर एसक्यूएल (एक बयान के स्तर के अनुसार, के साथ साथ एक अस्थायी तालिका के उपयोग) के साथ इष्टतम। यह यहां वास्तव में मुश्किल हिस्सा है।
  • हमने सीएमएस में क्या किया जहां हमने वही किया था कि प्रत्येक नोड अपने माता-पिता, शीर्ष नोड (एकाधिक ग्राफ के लिए) और अगले उच्च कंटेनर नोड को जानता था। कुछ नोड्स को कंटेनर के रूप में चिह्नित किया गया था - उनमें उप-वस्तुएं थीं, लेकिन ये अनौपचारिक रूप से एनोथ कंटेनर से संबंधित थीं (जैसे: वेबसाइट, फ़ोल्डर के साथ, फिर छवियों जैसे संसाधनों के साथ दस्तावेज़)।
1

Nested Sets - अद्यतन करने के लिए धीमी गति से लेकिन क्वेरी करने के लिए तेजी से।

1

हम बड़ी सफलता के साथ जहां हम प्रत्येक नोड एक स्ट्रिंग है नोड, के द्वारा अलग करने के लिए ऊपर से प्रत्येक नोड आईडी युक्त संग्रहीत '।' के लिए एक मॉडल का इस्तेमाल किया। एक पेड़ को पुनः प्राप्त करना बहुत ही कुशल हो जाता है, केवल स्ट्रिंग पर सॉर्ट करें।

यह मॉडल के रूप में कितना गहरा पदानुक्रम जा सकते हैं करने के लिए पाठ्यक्रम की एक सीमा है। लेकिन यह मुख्य रूप से आईडी स्ट्रिंग कॉलम के अधिकतम आकार से सीमित है। वर्चर (अधिकतम) का उपयोग कर SQL सर्वर में सीमा 2^31-1 बाइट्स है जो बहुत गहरी पदानुक्रमों के लिए बनाती है।

+0

दिलचस्प मैं इसे देखूंगा । –

0

आप पेड़ बनाने के रूप में 1. एमएम से नोड्स को नंबर दे सकते हैं, और इन इंडेक्स के संदर्भ में बच्चों के संदर्भों को स्टोर कर सकते हैं, अब बस पेड़ लिखें। आप एक ही पढ़ने में सभी नोड्स को पुनर्प्राप्त कर सकते हैं। नंबर योजना पेड़ जानकारी,

1

मेरे लिए यह अपने पेड़ के आकार और एक प्रश्न आप चलाना चाहते हैं के प्रकार पर निर्भर होता है।

जो मैं बता सकता हूं कि आपके पास दो डेटा आइटम हैं। MyId और MyParent। यदि आपने केवल दो चीजों के साथ एक साधारण तालिका बनाई है तो आप पूछ सकते हैं और जवाब दे सकते हैं कि मेरे बच्चे कौन हैं और मेरे माता-पिता कौन हैं।

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

यदि मेरा पेड़ बड़ा था या बनाने के लिए आधे सेकेंड से अधिक समय लगा, तो मैं इसे अपने सर्वर पर बनाए रखूंगा और इसे क्लाइंट को AJAX कॉल के साथ सुलभ बना दूंगा। यदि पेड़ सभी ग्राहकों के लिए स्थिर है तो यह सबसे अच्छा काम करता है।

यदि पेड़ गतिशील है तो मैं जोर देकर कहूंगा कि क्लाइंट सर्वर से डेटा पुनर्प्राप्त होने पर प्रतीक्षा करता है और पेड़ स्थानीय रूप से बनाया जाता है। इससे उपयोग की गति बढ़ेगी।

आप क्या जाहिर है जब आप ने कहा, "पेड़ विभाजित" के बारे में अधिक जानकारी प्रदान की अगर मैं एक बेहतर राय पेशकश करने में सक्षम हो सकता है। लेकिन आम तौर पर मुझे डेटाबेस में एक आदर्श पेड़ नहीं मिला है। हालांकि ओलाप में ऐसा उपकरण हो सकता है जिसे मैं नहीं जानता।

+0

हैलो madmik3। मुझे नहीं है जहाँ आप और स्तर और रैंक की दुकान मैं देखेंगे उपयोगकर्ता के लिए सिर्फ "थूक", पेड़ विभाजित करने के लिए की जरूरत है। मैं फ्लैट तालिका पेड़ मॉडल, एक तरह से कोशिश कर रहा हूँ अगर वहाँ से मैं पेड़ का निर्माण कर सकते हैं जैसा कि मैं चाहता हूं। सहायता के लिए धन्यवाद। कोई अन्य सुझाव आपका स्वागत है! –

0

जो सेल्को के लिए स्मार्टफोन बुक (अध्याय 2 9) के लिए एसक्यूएल में इसका समाधान है। सम्मिलन, अद्यतन, और हटावट थोड़ा जटिल हैं, लेकिन चयन बहुत तेज हैं। मैं इसे कुछ सालों से इस्तेमाल कर रहा हूं और यह बहुत अच्छी तरह से काम करता है।

+0

मैं उस अध्याय में देखूंगा। धन्यवाद! –

2

मैंने देखा है कि आप ओरेकल या PostgreSQL के रूप में अपने डीबीएस सूचीबद्ध। यदि आप ओरेकल से चिपके रह सकते हैं, तो आप start with और connect by कमांड का उपयोग आसानी से करने के लिए कर सकते हैं। बहुत सारे विकल्प हैं जो लूप हैं, या यदि आपको कुछ मानदंडों के आधार पर शाखा को फ़िल्टर करने की आवश्यकता है तो भी शानदार तरीके से संभाल लेंगे। मैंने व्यक्तिगत रूप से इसे एक उत्पादन प्रणाली में उपयोग किया है, जिसमें किसी भी प्रदर्शन के मुद्दों के बिना भारी पढ़ और लिखते थे।

एक त्वरित खोज से पता चलता है कि आप with recursive कमांड का उपयोग कर postgreSQL के साथ कुछ समान (हालांकि अधिक जटिल वर्गवार) कर सकते हैं। मैंने व्यक्तिगत रूप से इस विधि का उपयोग नहीं किया है, इसलिए मैं आपको और जानकारी नहीं दे सकता।

+0

हैलो चाड_के। मैंने ओरेकल और पोस्टग्रे के रिकर्सिव फ़ंक्शंस का उपयोग करने पर विचार किया है, लेकिन तब से वे मानक नहीं हैं, मैं उनका उपयोग नहीं करना पसंद करता हूं। अनुस्मारक के लिए धन्यवाद: पी –

+0

@ जॉर्ज: ओरेकल 11 जी एएनएसआई मानक रिक का समर्थन करता है साथ और CYCLE कीवर्ड का उपयोग कर ursion। यहां प्रारंभ करें: http://download.oracle.com/docs/cd/E11882_01/server.112/e10881/chapter1.htm#insertedID3 –

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