הוספת הנתונים לאינדקס

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

הגדרת אינדקסים של נתונים

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

הוספה לאינדקס עם orderByChild

הדרך הקלה ביותר להסביר את זה היא באמצעות דוגמה. כולנו ב-Firebase מסכימים שדינוזאורים הם מגניבים. הנה קטע קוד ממסד נתונים לדוגמה של עובדות על דינוזאורים. נשתמש בו כדי להסביר איך .indexOn עובד עם orderByChild().

{
  "lambeosaurus": {
    "height" : 2.1,
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "height" : 4,
    "length" : 9,
    "weight" : 2500
  }
}

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

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

בדומה לכללים אחרים, אפשר לציין כלל .indexOn בכל רמה בכללים. בדוגמה שלמעלה, מיקמנו אותו ברמת הבסיס כי כל נתוני הדינוזאורים מאוחסנים בבסיס של מסד הנתונים.

יצירת אינדקס באמצעות orderByValue

בדוגמה הזו נראה איך .indexOn עובד עם orderByValue(). נניח שאנחנו יוצרים טבלת הישגים של תוצאות משחקי ספורט של דינוזאורים עם הנתונים הבאים:

{
  "scores": {
    "bruhathkayosaurus" : 55,
    "lambeosaurus" : 21,
    "linhenykus" : 80,
    "pterodactyl" : 93,
    "stegosaurus" : 5,
    "triceratops" : 22
  }
}

מכיוון שאנחנו משתמשים ב-orderByValue() כדי ליצור את טבלת המובילים, אנחנו יכולים לבצע אופטימיזציה של השאילתות על ידי הוספת כלל .value בצומת /scores:

{
  "rules": {
    "scores": {
      ".indexOn": ".value"
    }
  }
}