09-06-2006, 22:37
|
|
|
חבר מתאריך: 13.12.05
הודעות: 1,963
|
|
הבנתי אותך, אבל זו לא הדרך לפי דעתי. לפחות לא ברקורסיה.
למבנה כזה, שהוא אינסופי יש כמה דרכים לפי דעתי - המקיימות את החוקיות הכללית שאתה רוצה ("תיאורטית אין סוף תת קטגוריות").
דרך ראשונה
- לתת ID (מזהה) ייחודי לכל קטגוריה (כמובן).
- ליצור תא בטבלה, שמכיל את ה"עץ".
- עץ מורכב מכל המזהים שעברת (כביכול) עד לקטגוריה הנוכחית.
- העץ יהיה בנוי בצורה הבאה לדוגמא: 004.006.012.130 - מכאן נובע שקטגוריה 130, העץ שלה יהיה 004.006.012
- מצב כזה יוצר לך אפשרות שבסידור אחד, אתה מקבל את כל הקטגוריות, וכל תת הקטגוריות בסידור היררכי ואתה רק צריך לבדוק כמה "נקודות" יש בעץ ולפי זה לבצע פעולות (הזחות, סידור במסך, וכו')
ישנן כמה בעיות עם הדרך הזו:- דורש תכנון מקפיד מראש ובנוי בעקרון למערכת קטגוריות מאוד מוגדרת (כדוגמא לפורומים)
- ברוב המקרים אתה צריך לכלול עוד כמה שדות של "אבא" מקרבה ראשונה, או "אבא" ראשי וכו'.
- קצת קשה לסדר את הפריטים לפי סדר שונה (למשל תאריך עדכון) ועדיין לקבל אותם בסדר היררכי.
- תלוי בדרישות אולי תצטרך גם טבלה נוספת של הקטגוריות הכי ראשיות.
- אפשר לחשוב על עוד זו פשוט דרך שמפשטת לך פחות או יותר את עניין ה"סידור" בשאילתה אחת אבל מגבילה אותך אפריורית בפיתוח.
דרך שנייה
- אותה טבלה כמו שאתה יצרת, עם מזהה שמצביע רק על ה"אבא".
- להוציא בכל פעם את כל טבלת הקטגוריות ובעזרת לולאה פשוטה, סריקה של כל התוצאות, mysql_data_seek (או כל דבר אחר שתרצה), ומשתנה שישמור את הקטגוריה שכרגע נצפית על ידי המשתמש בכדי לרוץ על העץ (אחורה) ולהוציא את המידע שאתה צריך.
דרך שלישית (צמצום תוצאות)
אם כל כוונתך היא להוציא 3 "אבות" בכל פעם אתה פשוט יכול לשרשר 3 JOINים על אותה טבלה או תת-שאילתות במקום ליצור שאילתה המתקיימת בתוך רקורסיה.
דרך רביעית (הכי חסכונית לפי דעתי)
להשתמש בAJAX, ולהוציא אך ורק את הקטגוריות שה"לקוח" מבקש לראות.
נערך לאחרונה ע"י GreenBerret בתאריך 09-06-2006 בשעה 22:53.
|