שלח תשובה

זירת השאלות

300
צפיות
5
תשובות

שליפת רשומות והצגתן באופן רקורסיבי

,‏ 2 במאי, 2005

הקדמה:
בניתי מערכת שמנהלת קטגוריות. יש קטגוריה ראשית, ולכל קטגוריה ראשית יכולות להיות תת-קטגוריות, ולכל תת-קטגוריות יכולים להיות עוד תתי-קטגוריות וכו’…

מבנה הטבלה:
קטגוריות(מס’ קטגוריה, שם הקטגוריה, מס’ קטגוריית אב)
(קו תחתון=מפתח ראשי, מי שלמד ארגון קבצים מכיר את זה )

אני מחפש את השיטה הכי יעילה לשליפת רשומות והצגתן באופן רקורסיבי.
אני אציג כאן 2 דרכים שחשבתי עליהן. תוכלו לבחור אחת מהן או להציע דרך משלכם שנראית יותר יעילה.

דרך ראשונה
נכתוב שגרה שתקבל את הפרמטר מס’ קטגוריית אב. השגרה תשלוף באמצעות שאילתה את כל הרשומות שמס’ קטגוריית האב שלהן שווה לפרמטר. לכל קטגוריה שהשגרה תציג, היא תקרא לעצמה באופן רקורסיבי כדי להציג את כל תתי-הקטגוריות ששייכים לאותה קטגוריה.
כדי לקרוא לשגרה בדרך כלל נשתמש במס’ קטגוריית אב 0 כדי להציג את כל ההודעות.
בשיטה זו השגרה מפעילה שאילתה בכל קריאה כדי לשלוף את הרשומות המתאימות.

דרך שניה
נכתוב שגרה שתקבל את הפרמטרים מס’ קטגוריית אב ואת האוסף של כל הרשומות מטבלת הקטגוריות. השגרה תריץ לולאה שתאתר את כל הרשומות שמס’ קטגוריית האב שלהן שווה לפרמטר. לכל קטגוריה שהשגרה תציג, היא תקרא לעצמה באופן רקורסיבי כדי להציג את כל תתי-הקטגוריות ששייכים לאותה קטגוריה.
כדי לקרוא לשגרה בדרך כלל נשתמש במס’ קטגוריית אב 0 ונשלוף את כל הרשומות מטבלת הקטגוריות כמובן.
בשיטה זו השגרה מפעילה שאילתה רק פעם אחת אך ישנן לולאות שמחפשות את הרשומות המתאימות במקום זאת.

תודה שקראתם את המגילה שלי ממתין לתשובות.

תגיות:

5 תשובות

  1. זהר פלד הגיב:

    הכי יעיל זה לשלוף את הכל,
    להעביר ללקוח,
    ושם לבצע את הרקורסיה.

  2. ניר טייב הגיב:

    באותה מידה אפשר גם לבצע
    סידור יותר נורמלי של הרשומות מלכת תחילה ואז את הסידור של העץ נעשה בצורה ליניארית – שימוש ב-DOM במקום ברקורסיה.

    1. יצירת עמודה חדשה שמורה על האב הראשי (נגיד FirstCategoryId)
    2. סידור: (משהו כמו זה)

    ORDER BY FirstCategoryId, parentId

    באופן הזה הרשומות קודם יסתדרו לפי האב הראשי ואז בתוך כל "קבוצה" של רשומות הם יסתדרו לפי ה-parentCategory
    3. העברת הנתונים לצד לקוח. (ע"י getString  או המחלקה של אוריקס)
    4. יצירת Container כללי לכל הקטגוריות
    4. מעבר ליניארי על כל הרשומות, עם ה-parentId=0 (נגיד) אז :
    4.1 יוצרים אלמנט חדש ומכלילים אותו בתוך ה-container הראשי ע"י appendChild ה-ID שלו יהיה אות מסוימת + ה-ID של הקטגוריה
    4.2 אם ה-parentId שונה מ-0 אז יוצרים אלמנט ומכלילים אותו בתוך אלמנט בעל ID המורכב מאות מסוימת + parentId של אותה קטגוריה.

  3. ניר טייב הגיב:

    וכמובן שניתן margin מתאים
    לאלמנטים שיוצרים משלב 4.

  4. ניר טייב הגיב:

    זה מקרה פשוט ביותר
    אם בפורום עץ נגיד אני מבטל את הנושא של הקפצת השרשורים (כלומר אין לי עמודת תאריך שצריך לסדר בעזרתה את השרשורים) אז אני יכול לעבוד כך
    אבל אם יש לי את הנושא של ההקפצה (כלומר יש את העמודה הנ"ל) אז זה

    או שאני מכניס את התאריך לרשומות שהם גם לא מהווים נושאים ראשיים ואז מסדר לפי הדרך שכתבתי  (רק מחליף את ה-FirstId ב-lastMessageDate) אבל אז אני עושה מניפולציות בהכנסה

    או שאני עובד בצורה הרקורסיבית

    או שאני עושה בדיוק כמו שאני תיארתי (רק להוסיף לפני ה-FirstId את תאריך ההקפצה) אבל אז כל הנושאים הראשיים יהיו בהתחלה ורק אחרכך התגובות מסודרות לפי שרשורים. נראה לי שזה בדיוק כמו השיטה שלי רק שהסידור קצת שונה, אבל לא ניסיתי את זה עדיין

שלח תשובה

חדש! אחסון אתרים של וובמאסטר

שירות אחסון אתרים
המקצועי של וובמאסטר!

מומחים באירוח אתרי
WordPress, Joomla, Drupal

  • שרתי לינוקס עם CloudLinux, LiteSpeed
  • 1GB דיסק SSD, 10GB תעבורה חודשית
  • ממשק ניהול cPanel, תעודת SSL חינם

עכשיו במחיר היכרות:
רק 420 ש"ח לשנה!