فایربیس به شما امکان میدهد با استفاده از یک کلید فرزند دلخواه، کوئریهای موقت روی دادههای خود انجام دهید. اگر از قبل میدانید که اندیسهای شما چه خواهند بود، میتوانید آنها را از طریق قانون .indexOn در قوانین امنیتی پایگاه داده بلادرنگ فایربیس خود تعریف کنید تا عملکرد کوئری بهبود یابد.
تعریف شاخصهای داده
فایربیس ابزارهای قدرتمندی برای مرتبسازی و پرسوجوی دادههای شما ارائه میدهد. بهطور خاص، فایربیس به شما امکان میدهد پرسوجوهای موقت را روی مجموعهای از گرهها با استفاده از هر کلید فرزند مشترک انجام دهید. با رشد برنامه شما، عملکرد این پرسوجو کاهش مییابد. با این حال، اگر در مورد کلیدهایی که پرسوجو خواهید کرد به فایربیس بگویید، فایربیس آن کلیدها را در سرورها فهرستبندی میکند و عملکرد پرسوجوهای شما را بهبود میبخشد.
فهرست بندی با 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"
}
}
}