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" } } }