فهرسة بياناتك

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