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