Firebase umożliwia wykonywanie zapytań ad hoc dotyczących danych przy użyciu dowolnego klucza podrzędnego. Jeśli znasz z góry indeksy, możesz je zdefiniować za pomocą reguły .indexOn w regułach zabezpieczeń Bazy danych czasu rzeczywistego Firebase, aby zwiększyć wydajność zapytań.
Definiowanie indeksów danych
Firebase udostępnia zaawansowane narzędzia do porządkowania danych i wykonywania zapytań. W szczególności Firebase umożliwia wykonywanie zapytań ad hoc dotyczących zbioru węzłów przy użyciu dowolnego wspólnego klucza podrzędnego. Wraz z rozwojem aplikacji wydajność tego zapytania będzie się pogarszać. Jeśli jednak poinformujesz Firebase o kluczach, których będziesz używać w zapytaniach, Firebase zindeksuje te klucze na serwerach, co zwiększy wydajność zapytań.
Indeksowanie za pomocą orderByChild
Najłatwiej wyjaśnić to na przykładzie. Wszyscy w Firebase zgadzamy się, że dinozaury są fajne. Oto fragment przykładowej bazy danych z faktami o dinozaurach. Użyjemy go, aby wyjaśnić, jak działa .indexOn 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 porządkować dinozaury według nazwy, wysokości i długości, ale nigdy według wagi. Możemy zwiększyć wydajność zapytań, informując o tym Firebase. Ponieważ nazwy dinozaurów są tylko kluczami, Firebase optymalizuje już zapytania według nazwy dinozaura, ponieważ jest to klucz rekordu.
Możemy użyć .indexOn, aby poinformować Firebase, że ma też optymalizować zapytania według wysokości i długości:
{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}Podobnie jak inne reguły, regułę .indexOn możesz określić na dowolnym poziomie w regułach.
W powyższym przykładzie umieściliśmy ją na poziomie głównym, ponieważ wszystkie dane dinozaurów są przechowywane w katalogu głównym bazy danych.
Indeksowanie za pomocą orderByValue
W tym przykładzie pokażemy, jak działa .indexOn z orderByValue().
Załóżmy, że tworzymy tabelę wyników sportowych dinozaurów na podstawie tych danych:
{
"scores": {
"bruhathkayosaurus" : 55,
"lambeosaurus" : 21,
"linhenykus" : 80,
"pterodactyl" : 93,
"stegosaurus" : 5,
"triceratops" : 22
}
}Ponieważ do utworzenia tabeli wyników używamy orderByValue(), możemy zoptymalizować zapytania, dodając regułę .value w węźle /scores:
{
"rules": {
"scores": {
".indexOn": ".value"
}
}
}