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