Firebase umożliwia wykonywanie zapytań ad hoc dotyczących danych przy użyciu dowolnego klucza potomnego. Jeśli wiesz z góry, jakie będą twoje indeksy, możesz je zdefiniować za pomocą reguły .indexOn
w Regułach bezpieczeństwa bazy danych czasu rzeczywistego Firebase, aby poprawić wydajność zapytań.
Definiowanie indeksów danych
Firebase zapewnia potężne narzędzia do porządkowania i wysyłania zapytań do danych. W szczególności Firebase umożliwia wykonywanie zapytań ad-hoc w zbiorze węzłów przy użyciu dowolnego wspólnego klucza potomnego. W miarę rozwoju aplikacji spada wydajność tego zapytania. Jeśli jednak poinformujesz Firebase o kluczach, o które będziesz pytać, Firebase zindeksuje te klucze na serwerach, poprawiając wydajność twoich zapytań.
Indeksowanie za pomocą orderByChild
Najłatwiej wyjaśnić to na przykładzie. Wszyscy w Firebase zgadzamy się, że dinozaury są całkiem fajne. Oto fragment przykładowej bazy danych faktów o dinozaurach. Użyjemy go do wyjaśnienia, jak .indexOn
działa z orderByChild()
.
{ "lambeosaurus": { "height" : 2.1, "length" : 12.5, "weight": 5000 }, "stegosaurus": { "height" : 4, "length" : 9, "weight" : 2500 } }
Wyobraźmy sobie, że w naszej aplikacji często musimy uporządkować dinozaury według nazwy, wzrostu i długości, ale nigdy według wagi. Możemy poprawić wydajność naszych zapytań, przekazując Firebase te informacje. Ponieważ nazwy dinozaurów to tylko klucze, Firebase już optymalizuje zapytania według nazwy dinozaurów, ponieważ jest to klucz rekordu. Możemy użyć .indexOn
aby powiedzieć Firebase, aby optymalizował zapytania również pod kątem wysokości i długości:
{ "rules": { "dinosaurs": { ".indexOn": ["height", "length"] } } }
Podobnie jak inne reguły, możesz określić regułę .indexOn
na dowolnym poziomie swoich reguł. Umieściliśmy go na poziomie katalogu głównego dla powyższego przykładu, ponieważ wszystkie dane dinozaurów są przechowywane w katalogu głównym bazy danych.
Indeksowanie za pomocą orderByValue
W tym przykładzie zademonstrujemy, jak .indexOn
działa z orderByValue()
. Załóżmy, że tworzymy tabelę wyników sportowych dino z następującymi danymi:
{ "scores": { "bruhathkayosaurus" : 55, "lambeosaurus" : 21, "linhenykus" : 80, "pterodactyl" : 93, "stegosaurus" : 5, "triceratops" : 22 } }
Ponieważ używamy orderByValue() do tworzenia tabeli liderów, możemy zoptymalizować nasze zapytania, dodając regułę .value
w naszym węźle /scores
:
{ "rules": { "scores": { ".indexOn": ".value" } } }