08-12-2007, 20:34
|
|
|
חבר מתאריך: 17.05.05
הודעות: 7,321
|
|
[MySQL]שאילתא אחת בלבד להחלפת שיטת הרקורסיה - תכנון נכון של הטבלה במסד
כבר הרבה זמן שאני מנסה למצוא דרך מסוימת, שאכתוב שאילתא אחת בלבד - וכל התוצאות יישלפו לפי הסדר הנכון והרצוי, במקום לבצע רקורסיה שתהיה הרבה פחות יעילה ולא רצויה (לפחות מבחינתי...).
לדוגמא, נכון לעכשיו, אני מנסה לעשות תפריט רקורסיבי שיהיה אפשר להוסיף לו כביכול אין סוף בנים וצאצאים...
מבחינת צד הלקוח (JS, CSS) - העניין טופל.
מבחינת צד השרת - אני מסתבך במציאת השאילתא הרצויה.
על מנת שיהיה אפשר להבין איך צריך לקבל את התוצאות מהשאילתא, אציג את עיקרון התפריט הרקורסיבי שכתבתי:
קוד:
<!--HTML-->
<ul id='menu'>
<li><a>Title1</a>
<ul>
<li><a>Sub Title1</a></li>
<li><a>Sub Title2</a>
<ul>
<li>Sub Sub title...</li>
</ul>
</li>
</ul>
</li>
<li>Title2
<ul>
<li><a>Sub Of Title2-#1</a></li>
<li><a>Sub Of Title2-#2</a></li>
</ul>
</li>
<li><a>Contact Us</a></li>
</ul>
הרעיון הוא שאקבל את התוצאות ממש לפי הסדר הנ"ל - מלמעלה למטה, וכך ישר אציג את הפלט למשתמש.
בינתיים, חשבתי על 2 שיטות לבניית הטבלה שלי:
שיטה 1: (עם parent_ID)
menus:
menu_id - INT, AUTO_INCREMENT
menu_title - VARCHAR
menu_isParent - BOOL, DEFAULT false
menu_parentId - INT, DEFAULT 0
menu_position - INT, DEFAULT 1
menu_creationTime - INT, DEFAULT 0
שיטה 2: (רשימה מקושרת)
menus:
menu_id - INT, AUTO_INCREMENT
menu_title - VARCHAR
menu_nextId - INT, DEFAULT 0
menu_creationTime - INT, DEFAULT 0
הערות:
השוני בין הטבלאות של השיטות הנ"ל מודגש באדום.
בשיטה 1 יש טור המודגש בכחול, כיוון שאני לא בטוח אם להוסיף אותו לטבלה.
כמובן שהגדלים של הטורים אינם בדיוק כפי שבמציאות. העיקר פה זה סוג הטור.
חשבתי על דרכים שונות וביניהם פיסקאות ORDER BY ו-JOIN'ים שונים, אבל זה לא היה מביא לי תוצאה מספיק טובה ובמקרים מסוימים גורם לכפילות נתונים...
כל עזרה תתקבל בברכה!
תודה רבה,
דור.
[נ.ב. פתחתי אשכול חדש, ולא כתבתי זאת באשכול האחרון הקרוב שפתחתי, כי שני הנושאים שונים לגמרי...]
נערך לאחרונה ע"י DCD בתאריך 08-12-2007 בשעה 20:48.
|