2010-11-13 16 views
6

मैं इष्टतम पेड़ समाधान खोजने के लिए एडजेंसी सूची और नेस्टेड सेट मॉडल में देख रहा हूं।एडजैसीसी सूची बनाम नेस्टेड सेट मॉडल

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

तो मैं इन दोनों से भी अधिक पोस्ट ठोकर खाई:

Recursive categories with a single query?

http://www.sitepoint.com/forums/showthread.php?t=570360

निम्नलिखित कोड मुझे एक SQL क्वेरी के साथ संलग्नता सूची का उपयोग करने के लिए अनुमति देता है। ऐसा लगता है कि एडजेंसी सूची अद्यतन करना आसान है और पूरे पेड़ को भ्रष्ट करने की संभावना कम है।

इस कोड के बारे में आप क्या सोचते हैं?

वृक्ष संरचना को प्रतिबिंबित करने के

$nodeList = array(); 
    $tree = array(); 

    $query = mysql_query("SELECT id, title, page_parent FROM categories ORDER BY page_parent"); 
    while($row = mysql_fetch_assoc($query)){ 
     $nodeList[$row['id']] = array_merge($row, array('children' => array())); 
    } 
    mysql_free_result($query); 

    foreach($query AS $row){ 
     $nodeList[$row['id']] = array_merge($row, array('children' => array())); 
    } 

    foreach ($nodeList as $nodeId => &$node) { 
     if (!$node['page_parent'] || !array_key_exists($node['page_parent'], $nodeList)) { 
      $tree[] = &$node; 
     } else { 
      $nodeList[$node['page_parent']]['children'][] = &$node; 
     } 
    } 

    unset($node); 
    unset($nodeList); 

नेस्टेड नोड्स

के साथ एक बिना क्रम वाली सूची तैयार एक बहु आयामी सरणी उत्पन्न
function printMenu ($arrTreeToTraverse, $ext = '.html', $breadcrumb = '') { 

// Pre loop stuff 
echo "<ul class=\"sf-menu\">\r\n"; 

foreach ($arrTreeToTraverse as $objItem) { 

    // Stuff relevant to the item, before looping over its children 
    if ($objItem['page_parent'] != 0) { 
     $breadcrumb .= '/'.$objItem['uri']; 
    } 
    else 
    { 
     $breadcrumb .= $objItem['uri']; 
    } 

    if ($objItem['uri'] == 'index') { 
     echo '<li><a href="/">'.$objItem['title'].'</a>'; 
    } else { 
     echo '<li><a href="'$_SERVER['SERVER_NAME'].'/'.$breadcrumb.$ext.'">'.$objItem['title'].'</a>'; 
    } 

    if ($objItem['children']) { 
    echo "\r\n"; 

     // Call the function again on the children 
     printMenu($objItem['children'], $ext, $breadcrumb); 
    }// if 

    // Extend breadcrumb if it is a child or 
    // reset breadcrumb if first level of tree 
    $parent = explode('/', $breadcrumb); 
    if ($objItem['page_parent'] != 0) { 
     $breadcrumb = $parent[0]; 
    } else { 
     $breadcrumb = ''; 
    } 

    echo "</li>\r\n"; 
}// foreach 

// Post loop stuff 
echo "</ul>\r\n"; 

}// function 

printMenu($navigation, '.html'); 
+0

'foreach ($ query AS $ पंक्ति)' के अलावा ठीक दिखता है, जिसकी आवश्यकता नहीं है और एक त्रुटि उठाएगी। – Fanis

उत्तर

7

कोड काफी ठीक और दिए गए पंक्तियों की एक उचित संख्या प्रतीत हो रहा है (लाखों पंक्तियां नहीं हैं) आपको बहुत कठिन, प्रदर्शन के रूप में नहीं मारेंगे।

लेकिन मुझे लगता है कि आप गलत सवाल पूछा है:

नेस्टेड सेट भूमिका निभाते हैं जब आप पार पदानुक्रम करने की जरूरत है और यह भी पूरे मेज लाने के क्रम में पता लगाने के लिए महंगा हो जाएगा एक निश्चित नोड के माता-पिता के माता-पिता। आसन्नता सूचियों के साथ आपको इसे प्राप्त करने के लिए कई प्रश्नों की आवश्यकता होगी या PHP को नेस्टेड लूप के साथ काम करने दें (जिसका अर्थ है ओ (एन^2) सबसे खराब मामला)।

किसी भी तरह से, पूर्वजों को खोजने के दौरान नेस्टेड सेट आमतौर पर बेहतर प्रदर्शन करेंगे (उदाहरण के लिए नेस्टेड श्रेणियों के पदानुक्रम में एक उत्पाद खोजें)।

यह आलेख देखें: Managing Hierarchical Data in MySQL। यह आपको विभिन्न प्रश्न/अपडेट/सम्मिलन/हटाने को कार्यान्वित करने के तरीके पर एक अच्छा प्रारंभिक बिंदु देगा।

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