Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

डेटा के पदानुक्रम से परिभाषित सेट की एक चपटी तालिका/दृश्य बनाना

तो आप जो चाहते हैं वह है सकर्मक बंदों को अमल में लाना। यानी इस एप्लीकेशन टेबल को दिया गया है...

 ID   | PARENT_ID
------+----------
    1 | 
    2 |         1
    3 |         2
    4 |         2
    5 |         4

... ग्राफ़ तालिका इस तरह दिखेगी:

 PARENT_ID | CHILD_ID
-----------+----------
         1 |        2
         1 |        3
         1 |        4
         1 |        5
         2 |        3
         2 |        4
         2 |        5
         4 |        5

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

मुझे नहीं लगता कि आप CONNECT BY प्रश्नों और कैस्केडिंग विदेशी कुंजियों के साथ ऐसी ग्राफ तालिका बनाए रख सकते हैं। बहुत अधिक अप्रत्यक्ष गतिविधि, ठीक करना बहुत कठिन। इसके अलावा एक भौतिक दृश्य बाहर है, क्योंकि हम एक SQL क्वेरी नहीं लिख सकते हैं जो 1->5 को जप करेगी रिकॉर्ड जब हम ID=4 . के स्रोत रिकॉर्ड को हटाते हैं ।

तो मेरा सुझाव है कि आप डोंग, लिबकिन, सु और वोंग द्वारा एसक्यूएल में ग्राफ के ट्रांजिटिव क्लोजर को बनाए रखना नामक एक पेपर पढ़ें। इसमें बहुत सारे सिद्धांत और कुछ गंभीर (ओरेकल) एसक्यूएल शामिल हैं लेकिन यह आपको पीएल/एसक्यूएल बनाने के लिए ग्राउंडिंग देगा जो आपको ग्राफ टेबल बनाए रखने के लिए आवश्यक है।

<ब्लॉकक्वॉट>

"क्या आप इस बारे में विस्तार कर सकते हैं कि इसे कनेक्ट बाय/कैस्केडिंग एफके के साथ बनाए रखना बहुत मुश्किल है? अगर मैं टेबल तक पहुंच को नियंत्रित करता हूं और संग्रहीत प्रक्रियाओं के माध्यम से सभी सम्मिलित/अपडेट/डिलीट होते हैं, तो किस प्रकार के परिदृश्य हैं जहां यह टूट जाएगा?"

रिकॉर्ड पर विचार करें 1->5 जो 1->2->4->5 . का शॉर्ट-सर्किट है . अब क्या होगा यदि, जैसा कि मैंने पहले कहा था, हम ID=4 . के स्रोत रिकॉर्ड को हटा देते हैं ? कैस्केडिंग विदेशी कुंजियाँ 2->4 . के लिए प्रविष्टियाँ हटा सकती हैं और 4->5 . लेकिन वह 1->5 . छोड़ देता है (और वास्तव में 2->5 ) ग्राफ़ तालिका में हालांकि वे अब ग्राफ़ में मान्य किनारे का प्रतिनिधित्व नहीं करते हैं

क्या काम कर सकता है (मुझे लगता है, मैंने इसे नहीं किया है) इस तरह स्रोत तालिका में एक अतिरिक्त सिंथेटिक कुंजी का उपयोग करना होगा।

 ID   | PARENT_ID | NEW_KEY
------+-----------+---------
    1 |           | AAA
    2 |         1 | BBB
    3 |         2 | CCC
    4 |         2 | DDD
    5 |         4 | EEE

अब ग्राफ टेबल कुछ इस तरह दिखेगी:

 PARENT_ID | CHILD_ID | NEW_KEY
-----------+----------+---------
         1 |        2 | BBB
         1 |        3 | CCC
         1 |        4 | DDD
         1 |        5 | DDD
         2 |        3 | CCC
         2 |        4 | DDD
         2 |        5 | DDD
         4 |        5 | DDD

तो ग्राफ़ तालिका में स्रोत तालिका में संबंध को संदर्भित करने वाली एक विदेशी कुंजी है, जिसने इसे आईडी से लिंक करने के बजाय उत्पन्न किया है। फिर ID=4 . के लिए रिकॉर्ड हटाना ग्राफ़ तालिका में सभी रिकॉर्ड्स को कैस्केड करेगा जहां NEW_KEY=DDD .

यह तब काम करेगा जब किसी दी गई आईडी में केवल शून्य या एक पैरेंट आईडी हो सकती है। लेकिन अगर ऐसा होने की अनुमति है तो यह काम नहीं करेगा:

 ID   | PARENT_ID
------+----------
    5 |         2
    5 |         4

दूसरे शब्दों में किनारे 1->5 दोनों का प्रतिनिधित्व करता है 1->2->4->5 और 1->2->5 . तो, क्या काम कर सकता है यह आपके डेटा की जटिलता पर निर्भर करता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या Oracle के कुछ संस्करणों में सहसंबद्ध उपश्रेणियों के लिए नेस्टिंग सीमा है?

  2. अद्यतन क्वेरी अगर Oracle के लिए बयान

  3. java.library.path में कोई ocijdbc9 नहीं है

  4. एयरफ्लो को ओरेकल डेटाबेस से कैसे कनेक्ट करें

  5. ओरेकल संग्रहित प्रक्रिया से परिणाम प्राप्त करें