يتيح لك 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"
}
}
}