يتيح لك Firebase إجراء استعلامات مخصصة على بياناتك باستخدام مفتاح فرعي عشوائي. إذا كنت تعرف مسبقًا ما هي الفهارس الخاصة بك ، فيمكنك تحديدها عبر قاعدة .indexOn
في قواعد أمان قاعدة بيانات Firebase Realtime لتحسين أداء الاستعلام.
تحديد فهارس البيانات
يوفر 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" } } }