אחסון נכון של רשומות המקיימות ביניהם קשר 'עץ'
-
שלום לכולם
יש לי טבלה של 'תיקיות'
בטבלה יש 4 שדותfolder_id
,folder_name
,parent_folder
,account_id
המבנה של התיקיות הוא בצורה של עץ ואני מממש את זה במסד הנתונים באמצעות שדהparent_folder
כך שלתיקיות הראשיות יש ערך 0, והתיקיות המשניות מכילות את ערךfolder_id
של התיקיה שמעליהם.
כעת יש לי בעיה, במידה ואני מעוניין לשכפל את כל מערך התיקיות מחשבון אחד לחשבון אחר, אין לי אפשרות לעשות insert של כל הרשומות כמו שהם, מכיון שאני צריך לשייך את תיקיות המשנה למזהה החדש של תיקיות האב בחשבון אליו אני משכפל.
מה שאני עושה כיום זה לולאה רקורסיבית שמריצה שאילתות SQL, כך שכל 'רמה' של תיקיות מתווספת בפני עצמה ואז בהתקבל המזהה החדש אני מוסיף את הרשומות הבאות.
החסרון הגדול בשיטה הזו הוא כמובן עניין הביצועים.חשבתי על פתרון בעניין, והוא שהשיוך לתיקיות האב לא יהיה באמצעות המזהה הפיזי
folder_id
אלא באמצעות שדה נוסף שיקרא לדוגמאtree_id
שיקבע בצורה ידנית ולא אוטומטית (נניח על פי הזמן יוניקס של רגע הוספת התיקיה), ואז אין לי בעיה לשכפל את כל מערך התיקיות כמו שהוא בשינוי הaccont_id
מכיון שהשיוך לתיקית האב יתבצע על פי שדהparent_folder
בצירוף הaccount_id
.
אבל מרגיש לי שזה פיתרון לא כ"כ חוקי ותקין.אשמח לשמוע חוות דעת, או פתרון וכיוון אחר.
תודה מראש!
-
@dovid
תודה!
לגבי שכיחות העתקת תיקיות, באמת לא כ"כ מצוי העתקה של תיקיות מחשבון לחשבון, אבל ישנו גם חשבון שנקרא 'מאגר כללי' שכל משתמש יכול לייבא אותו לחשבון הפרטי שלו, הפעולה הזאת מתרחשת פעמים רבות, לפחות כמה פעמים ביום
מלבד זאת, בעיית הביצועים הייתה 'עולה' - במידה ומדובר בכמות גדולה של תיקיות (שתחתיהם יש קבצים) כ- 12 שניות - הרצה של כ 600 שאילתות, מדובר על ממשק טלפוני ולא אינטרנטי, ולכן עיכוב כזה לא היה בא בחשבון אפילו לא אם קורה רק פעם בשבוע -
@yossiz כתב באחסון נכון של רשומות המקיימות ביניהם קשר 'עץ':
פתרון אחר לבעיות כאלו זה להשתמש ב-UUID כך אפשר לחולל את ה-ID בלי להריץ את השאילתא
מה שכתבתי יעזור רק אם אתה (בכל מקרה) שולף את העץ לקוד של התוכנה ורוצה להכניס חזרה עם INSERT אחד
אבל יותר יעיל לעשות INSERT... SELECT ואז לא יעזור UUID