דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. אחסון נכון של רשומות המקיימות ביניהם קשר 'עץ'

אחסון נכון של רשומות המקיימות ביניהם קשר 'עץ'

מתוזמן נעוץ נעול הועבר תכנות
6 פוסטים 3 כותבים 376 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ד מנותק
    ד מנותק
    דאטה בייס
    כתב ב נערך לאחרונה על ידי
    #1

    שלום לכולם
    יש לי טבלה של 'תיקיות'
    בטבלה יש 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.
    אבל מרגיש לי שזה פיתרון לא כ"כ חוקי ותקין.

    אשמח לשמוע חוות דעת, או פתרון וכיוון אחר.

    תודה מראש!

    תגובה 1 תגובה אחרונה
    2
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      כתב ב נערך לאחרונה על ידי
      #2

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

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      ד תגובה 1 תגובה אחרונה
      0
      • ד מנותק
        ד מנותק
        דאטה בייס
        השיב לdovid ב נערך לאחרונה על ידי
        #3

        @dovid
        תודה!
        לגבי שכיחות העתקת תיקיות, באמת לא כ"כ מצוי העתקה של תיקיות מחשבון לחשבון, אבל ישנו גם חשבון שנקרא 'מאגר כללי' שכל משתמש יכול לייבא אותו לחשבון הפרטי שלו, הפעולה הזאת מתרחשת פעמים רבות, לפחות כמה פעמים ביום
        מלבד זאת, בעיית הביצועים הייתה 'עולה' - במידה ומדובר בכמות גדולה של תיקיות (שתחתיהם יש קבצים) כ- 12 שניות - הרצה של כ 600 שאילתות, מדובר על ממשק טלפוני ולא אינטרנטי, ולכן עיכוב כזה לא היה בא בחשבון אפילו לא אם קורה רק פעם בשבוע

        תגובה 1 תגובה אחרונה
        1
        • yossizY מנותק
          yossizY מנותק
          yossiz
          כתב ב נערך לאחרונה על ידי
          #4

          פתרון אחר לבעיות כאלו זה להשתמש ב-UUID כך אפשר לחולל את ה-ID בלי להריץ את השאילתא

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          yossizY תגובה 1 תגובה אחרונה
          1
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            כתב ב נערך לאחרונה על ידי dovid
            #5

            שאלה כזו מופיעה פה: https://stackoverflow.com/q/28552101/1271037
            שמה יש פתרון רקורסיבי, ועוד פתרון מתוחכם עם תוספת קבועה של הID הגבוה ביותר.
            אני מעדיף את הפתרון של tree_id, וזה יכול להיות סתם מספר בעומק, כלומר רמה 1 זה אפס וכולי.

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            2
            • yossizY מנותק
              yossizY מנותק
              yossiz
              השיב לyossiz ב נערך לאחרונה על ידי
              #6

              @yossiz כתב באחסון נכון של רשומות המקיימות ביניהם קשר 'עץ':

              פתרון אחר לבעיות כאלו זה להשתמש ב-UUID כך אפשר לחולל את ה-ID בלי להריץ את השאילתא

              מה שכתבתי יעזור רק אם אתה (בכל מקרה) שולף את העץ לקוד של התוכנה ורוצה להכניס חזרה עם INSERT אחד
              אבל יותר יעיל לעשות INSERT... SELECT ואז לא יעזור UUID

              📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

              תגובה 1 תגובה אחרונה
              2

              בא תתחבר לדף היומי!
              • התחברות

              • אין לך חשבון עדיין? הרשמה

              • התחברו או הירשמו כדי לחפש.
              • פוסט ראשון
                פוסט אחרון
              0
              • דף הבית
              • קטגוריות
              • פוסטים אחרונים
              • משתמשים
              • חיפוש
              • חוקי הפורום