दुर्भाग्य से, यदि आप डेटा मॉडल नहीं बदल सकते हैं, और आप MySQL का उपयोग कर रहे हैं, तो आप ऐसी स्थिति में फंस गए हैं जहाँ आपको पुनरावर्ती प्रश्नों की आवश्यकता है और आप एक DBMS का उपयोग कर रहे हैं जो पुनरावर्ती प्रश्नों का समर्थन नहीं करता है।
क्वास्नोई ने ब्लॉग लेखों की एक दिलचस्प श्रृंखला लिखी, जिसमें पदानुक्रमित डेटा को क्वेरी करने की तकनीक दिखाई गई। उनके समाधान काफी चतुर हैं, लेकिन बहुत जटिल हैं।http:// clearextended.com/2009/03/17/hierarchical-queries-in-mysql/
PostgreSQL एक अन्य ओपन-सोर्स RDBMS है, जो पुनरावर्ती प्रश्नों का समर्थन करता है। ए> , ताकि आप अपने दिखाए गए तरीके से संग्रहीत एक पूरा पेड़ ला सकें। लेकिन अगर आप डेटा मॉडल नहीं बदल सकते हैं, तो मैं मान सकता हूं कि आप किसी दूसरे RDBMS पर स्विच नहीं कर सकते।
कई वैकल्पिक डेटा मॉडल हैं जो मनमाने ढंग से गहरे पेड़ों को लाना बहुत आसान बनाते हैं:
- क्लोजर टेबल
- नेस्टेड सेट उर्फ संशोधित प्रीऑर्डर ट्री ट्रैवर्सल
- पथ गणना उर्फ भौतिक पथ
मैं इन्हें अपनी प्रस्तुति में शामिल करता हूं SQL और PHP के साथ पदानुक्रमित डेटा के लिए मॉडल , और मेरी पुस्तक में SQL एंटीपैटर्न:डेटाबेस प्रोग्रामिंग के नुकसान से बचना ।
अंत में, एक और समाधान है जिसे मैंने Slashdot के कोड में उपयोग करते हुए देखा है। , उनकी टिप्पणियों के पदानुक्रम के लिए:वे "parent_id" को जैसे कि Adjacency List में स्टोर करते हैं, लेकिन वे एक "root_id" कॉलम भी स्टोर करते हैं। किसी दिए गए पेड़ के प्रत्येक सदस्य का root_id के लिए समान मान होता है, जो उसके पेड़ में उच्चतम पूर्वज नोड है। फिर एक प्रश्न में पूरे पेड़ को लाना आसान है:
SELECT * FROM site WHERE root_id = 123;
फिर आपका एप्लिकेशन डेटाबेस से सभी नोड्स को एक सरणी में वापस लाता है, और आपको इस सरणी पर लूप को कोड लिखना होगा, नोड्स को मेमोरी में ट्री डेटा स्ट्रक्चर में डालना होगा। यह एक अच्छा समाधान है यदि आपके पास कई अलग-अलग पेड़ हैं, और प्रत्येक पेड़ में अपेक्षाकृत कम प्रविष्टियां हैं। यह स्लैशडॉट के मामले के लिए अच्छा है।