सरल एडजैसीसी मॉडल का उपयोग करके जहां प्रत्येक पंक्ति में उसके माता-पिता का संदर्भ होता है जो एक ही तालिका में एक और पंक्ति का संदर्भ लेता है, जेपीए के साथ सह-संचालन नहीं करता है। ऐसा इसलिए है क्योंकि जेपीए को क्लॉज या एसक्यूएल मानक के साथ ओरेकल कनेक्ट का उपयोग करके प्रश्न उत्पन्न करने के लिए समर्थन नहीं है। उन 2 खंडों में से किसी के बिना एडजेंसी मॉडल को उपयोगी बनाना वास्तव में संभव नहीं है।
हालांकि, इस समस्या को हल करने के लिए कुछ अन्य दृष्टिकोण हैं जो इस समस्या पर लागू हो सकते हैं। पहला सामग्रीकृत पथ मॉडल है। यह वह जगह है जहां नोड का पूरा पथ एक स्तंभ में चपटा हुआ है। तालिका परिभाषा इतनी तरह बढ़ा दिया गया है:
CREATE TABLE node (id INTEGER,
path VARCHAR,
parent_id INTEGER REFERENCES node(id));
नोड्स के एक पेड़ सम्मिलित करने के लिए जैसे कुछ बात दिखता है:
INSERT INTO node VALUES (1, '1', NULL); -- Root Node
INSERT INTO node VALUES (2, '1.2', 1); -- 1st Child of '1'
INSERT INTO node VALUES (3, '1.3', 1); -- 2nd Child of '1'
INSERT INTO node VALUES (4, '1.3.4', 3); -- Child of '3'
तो नोड '1' और इसके सभी प्राप्त करने के लिए क्वेरी है:
SELECT * FROM node WHERE id = 1 OR path LIKE '1.%';
इसे जेपीए में मैप करने के लिए बस 'पथ' कॉलम को अपनी सतत वस्तु का एक गुण बनाएं। हालांकि आपको 'पथ' फ़ील्ड को अद्यतित रखने के लिए पुस्तक-पालन करना होगा। जेपीए/हाइबरनेट आपके लिए यह नहीं करेगा। जैसे यदि आप नोड को किसी भिन्न माता-पिता में ले जाते हैं तो आपको मूल संदर्भ दोनों को अपडेट करना होगा और नए पैरेंट ऑब्जेक्ट से नया पथ मान निर्धारित करना होगा।
अन्य दृष्टिकोण को नेस्टेड सेट मॉडल कहा जाता है, जो थोड़ा अधिक जटिल है। संभवत: described इसके उत्प्रेरक द्वारा (मेरे द्वारा अतिरिक्त वर्बैटिम के बजाय)।
नेस्टेड अंतराल मॉडल नामक एक तीसरा दृष्टिकोण है, हालांकि इसे लागू करने के लिए संग्रहीत प्रक्रियाओं का भारी निर्भरता है।
The Art of SQL के अध्याय 7 में इस समस्या का एक और अधिक पूर्ण स्पष्टीकरण वर्णित है।
यह सब बल्कि अधिक मैं क्या देख रहा था की तुलना में जटिल है, लेकिन जानकारीपूर्ण प्रतिक्रिया के लिए धन्यवाद। भौतिकीकृत पथ मॉडल के लिए एक आसान विकल्प भी है - प्रत्येक नोड पेड़ के रूट नोड की आईडी संग्रहीत करता है जो यह संबंधित है। इसका मतलब यह है कि आप केवल रूट नोड का उपयोग क्वेरी के शुरुआती बिंदु के रूप में कर सकते हैं, लेकिन मेरे विशिष्ट मामले में यह कोई समस्या नहीं है - तो शायद यह है कि मैं क्या करूँगा। –
आप जेपीए के माध्यम से प्रबंधित आसन्नता सूचियों का उपयोग कर सकते हैं, लेकिन पुनरावर्ती एसक्यूएल सुविधाओं का उपयोग करने के लिए मूल क्वेरी का उपयोग कर सकते हैं। यह थोड़ा सा मुश्किल होगा, और पोर्टेबल नहीं होगा, लेकिन यह दोनों दुनिया के सर्वश्रेष्ठ में से कुछ होगा। नेस्टेड सेट पोर्टेबल हैं, लेकिन विचित्र रूप से, और कुछ सामान्य प्रकार के प्रश्नों के लिए बहुत अच्छा प्रदर्शन नहीं करते हैं। –
जेपीए 2.0 के साथ कुछ भी बदल गया है ... उदाहरण के लिए, मैंने अपनी क्वेरी में 'कनेक्ट बाय' क्लॉज रखने के लिए मूल नामांकितQuery का उपयोग किया है। मैंने कोशिश की है और यह बच्चों को वापस कर देता है, लेकिन एक हास्यास्पद सूची रूप में नहीं ... बस फ्लैट बच्चों। कोई विचार? – SoftwareSavant