2010-04-07 11 views
10

मैं एक MySQL तालिका कि एक पेड़ जीयूआई घटक के लिए डेटा का प्रतिनिधित्व करता है, यहाँ मेरी तालिका की संरचना है:एक पदानुक्रमित mysql तालिका में नोड के सभी माता-पिता का चयन कैसे करें?

treeTable ( 
    id INT NOT NULL PRIMARY KEY, 
    parentId INT, 
    name VARCHAR(255) 
); 

parentId एक स्वयं को संदर्भित विदेशी कुंजी है।

अब मैं एक संग्रहित प्रक्रिया लिखना चाहता हूं जो नोड आईडी प्राप्त करता है और परिणाम सेट देता है जिसमें उस नोड और उसके सभी माता-पिता शामिल होते हैं।

उदाहरण के लिए, मान लीजिए कि मेरी मेज इस डेटा के साथ भरी है:

1, null, 'root' 
2, 1 , 'level_1' 
3, 2 , 'level_2' 

अब मैं नोड 3 के सभी माता-पिता नोड्स प्राप्त करना चाहते हैं (नोड 1 और 2) और एक परिणाम के सेट है कि सभी पेड़ शामिल वापसी रिकॉर्ड। क्या कोई कृपया मेरी सहायता कर सकता है?

+0

देखो: [श्रेणीबद्ध-डेटा-इन-mysql] [1] [1]: http://stackoverflow.com/questions/1085287/hierarchical-data-in- माई एसक्यूएल –

उत्तर

2

अच्छा सवाल। ओरेकल में आप की तरह कुछ उपयोग करेंगे से कनेक्ट करें।

चूंकि आप MySQL का उपयोग कर रहे हैं, तो मैं सुझाव दूंगा कि आप अपनी क्वेरी संरचना को कुशलतापूर्वक उस क्वेरी का उत्तर देने के लिए बदल दें। Here कुछ विचार हैं।

1

There was a similar discussion इस समस्या को हल करने में मददगार हो सकता है।

मुझे लगता है कि जब तक मैं रूट नोड (पैरेंट शून्य था) तक डेटा को पुनः प्राप्त करने से इस समस्या पर हमला कर सकता हूं। हो सकता है कि मैं इसे संग्रहीत प्रक्रिया के बाहर शुरू करने के इच्छुक हो (बार-बार चीज को तब तक बुलावा जब तक कि पुनर्प्राप्त पंक्ति में नल पैरेंट न हो), लेकिन यहां संदर्भित पृष्ठ पर "क्लोजर टेबल" समाधान एक अच्छा समाधान जैसा दिखता है।

1

"एकल पथ पुनर्प्राप्त" के अंतर्गत here देखें। लेकिन बेहतर नेस्टेड सेट दृष्टिकोण का बेहतर उपयोग करें, यह पेड़ के साथ काम करना बहुत आसान होगा। इसके अलावा मैं "Trees In The Database - Advanced data structures" प्रस्तुति पढ़ने की सलाह देता हूं।

1

इसके बारे में सोचने के लिए materialized paths भी है। बहुत सरल अवधारणा है कि वास्तव में डेटाबेस अज्ञेयवादी है। नेस्टेड सेट के विपरीत इन्सर्ट इत्यादि को प्रबंधित करना बहुत आसान है, आपको यह पता नहीं होना चाहिए कि आप डालने से पहले बाएं/दाएं नोड्स आदि हैं।

1

MySQL तालिका मूल्यवान कार्यों का समर्थन नहीं करता 18.2.1. Stored Routine Syntax (जो आपको मनमाना परिणाम सेट करने में सक्षम होने की आवश्यकता है)।

उनके बिना

आप तीन विकल्प हैं:

  1. एक निश्चित अधिकतम गहराई तक पेड़ क्वेरी उतारना और अपने पदानुक्रम में अनुमति दी घोंसले की सीमा है,
  2. एक पाश का उपयोग एक अस्थायी तालिका में डेटा लिखने के लिए और कॉलर को परिणाम वापस करने के लिए कुछ सम्मेलन पेश करें। आपको फिर से प्रवेश करने की आवश्यकता होगी, या
  3. प्रत्येक घटक के सभी पूर्वजों को एक समर्थन तालिका (जैसा दिखाया गया है) में परिणामों की पूर्व गणना करें और इसे ट्रीटेबल पर ट्रिगर्स के साथ बनाए रखें। इस तरह, संग्रहित प्रक्रिया माता-पिता में पंक्तियों को उचित रूप से फ़िल्टर किया जाता है। आपको कुशल पहुंच के लिए एक यौगिक प्राथमिक कुंजी और संभवतः सूचकांक बनाना होगा।

तीसरा विकल्प बहुत छोटी पंक्तियां है, अच्छा प्रदर्शन देगा और कृत्रिम सीमाओं से बचा जाएगा।

parentTable (
    id INT NOT NULL, 
    parentId INT NOT NULL 
); 

नेस्टेड सेट दृष्टिकोण का उपयोग करने का सुझाव इस एप्लिकेशन में उपयुक्त हो सकता है जहां डेटा काफी हद तक स्थैतिक है। तेजी से बदलते डेटासेट I/O प्रदर्शन पर प्रभाव डालना शुरू कर देंगे क्योंकि तालिका में पंक्तियों के औसत आधे भाग प्रत्येक डालने या हटाने के लिए अपडेट किए जाते हैं। इस विषय पर

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