mysql डाटाबेस में पदानुक्रमित डेटा संरचना को कार्यान्वित करना




database hierarchical-data (5)

मुझे पता है कि दो दृष्टिकोण हैं: आसन्न सूची और नेस्टेड पेड़ ऐसा कहा जाता है कि असंख्य प्रश्नों के कारण निकटस्थ सूची धीमे हो सकती है लेकिन मैं इसके लिए कोई वास्तविक आंकड़े नहीं जानता। जो साइट मैं बना रहा हूँ वह 200 पृष्ठों के क्षेत्र में होगा। ट्रैसरल उत्पन्न करने के लिए (उदाहरण के लिए) एक साइटमैप 0.3 सेकंड से अधिक समय तक ले जा रहा है?

LAMP स्टैक के साथ MySQL (innoDB) पर चल रहा है।

मैं संभवतः अगर अधिक सरल डिजाइन के कारण संभव हो तो आसन्नता को लागू करना चाहूंगा

धन्यवाद।


Answer #1

आपके उल्लेख में बताए गए दो से ज्यादा विकल्प हैं वहां:

  • स्थिरता सूची ("parent_id" लगभग सभी का उपयोग करता है)
  • नेस्टेड समूह
  • पथ की गणना
  • क्लोजर टेबल (उर्फ एडजेन्सिटी रिलेशन)

मेरा जवाब देखें " पेड़ में एक फ्लैट तालिका को पार्स करने के लिए सबसे कुशल / सुरुचिपूर्ण तरीका क्या है? "

या कुछ किताबें:


Answer #2

दूसरे दृष्टिकोण को "नेस्टेड सेट" कहा जाता है, मुझे लगता है कि "नेस्टेड ट्री" नहीं है

वैसे भी, एक साइट मानचित्र के बारे में एक अच्छी बात यह है कि आप इसकी अधिकतम गहराई जान सकते हैं मुझे लगता है कि आसन्न मॉडल के साथ समस्या यह है कि संबंधित एसक्यूएल एक समय में एक स्तर पर काम करता है, इसलिए यदि आपके पास 'एन' का स्तर है तो आपको 'n' SQL कथन के लूप की आवश्यकता है ... लेकिन मुझे लगता है (मैं ' मुझे यकीन नहीं है) कि अगर आप अग्रिम 'एन' को जानते हैं तो आप एसटीक की एक निश्चित संख्या के कोड को कोडित कर सकते हैं।

0.3 सेकंड मुझे 200 पन्नों को आंकने के लिए एक बहुत लंबे समय की तरह लगता है, ताकि शायद ठीक है

इसके अलावा एक साइट मानचित्र अक्सर अद्यतन नहीं होता है; तो भी अगर यह एसक्यूएल से पुनः प्राप्त करने के लिए एक लंबा समय लेता है, तो आप संभवतः रैम में पुनर्प्राप्त / गणना वाले पेस्ट को कैश कर सकते हैं।

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


Answer #3

एक आसन्न सूची को पार्स करने के लिए सहज तरीके से बहुत सारे प्रश्नों की आवश्यकता होती है, और बड़ी सूचियों के लिए मेमोरी में निर्माण करने में महत्वपूर्ण समय लग सकता है संदर्भ के लिए, मैं जिस उल्लिखित दृष्टिकोण का उल्लेख कर रहा हूं, उसे संक्षेप में किया जा सकता है: कोई भी माता-पिता के साथ सभी आइटम का चयन करें, फिर प्रत्येक आइटम के लिए इसे बार-बार मिलता है बच्चे। इस दृष्टिकोण के लिए n + 1 डेटाबेस प्रश्नों की आवश्यकता है

मैंने 1 क्वेरी के साथ एक आसन्न सूची बनाने के लिए निम्नलिखित दृष्टिकोण का उपयोग किया है सभी आइटम्स को डेटाबेस के रूप में चुनें। सभी चीजों को उनके कुंजी द्वारा अनुक्रमित सरणी में स्थानांतरित करें सरणी को पार करें और माता-पिता की वस्तु से प्रत्येक बच्चे को संदर्भ निर्दिष्ट करें। सरणी को दूसरी बार घुमाएं और सभी मूल वस्तुओं को केवल रूट स्तर ऑब्जेक्ट के पीछे छोड़ दें।

चूंकि आपने LAMP स्टैक का उल्लेख किया है, ऐसा करने के लिए PHP कोड निम्नानुसार है:

<?php
// Assumes $src is the array if items from the database.
$tmp = array();

// Traverse the array and index it by id, ensuing each item has an empty array of children.
foreach ($src as $item) {
  $item['children'] = array();
  $tmp[$item['id']] = $item;
}

// Now traverse the array a second time and link children to their parents.
foreach ($tmp as $id => $item) {
  if ($item['parent_id'] != 0 || $item['parent_id'] !== NULL) {
    $tmp[$item['parent_id']]['children'][$id] = &$tmp[$id];
  }
}

// Finally create an array with just root level items.
$tree = array();
foreach ($tmp as $id => $item) {
  if ($item['parent_id'] == 0 || $item['parent_id'] === NULL) {
    $tree[$id] = $item;
  }
}

// $tree now contains our adjacency list in tree form.
?>

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

जिम,



Answer #5

आलेख MySQL में पदानुक्रमित डेटा का प्रबंधन इस बारे में ब्योरे में आता है

मैं "नेस्टेड सेट" तकनीक की सिफारिश करता हूं, क्योंकि यह आपको एक प्रश्न में पूरे पेड़ (और उसके बच्चों) को प्राप्त करने की अनुमति देता है। असल में पढ़ा जाता है सस्ता होता है लेकिन लिखते हैं महंगा क्योंकि पूरे पेड़ को फिर से संतुलित करना पड़ता है लेकिन ऐसे मामलों में जहां आपके पास 99% पढ़ता है, तब इसकी पूरी तरह से उचित है।





hierarchical-data