Indeksuj swoje dane

Firebase umożliwia wykonywanie zapytań ad hoc na Twoich danych przy użyciu dowolnego klucza podrzędnego. Jeśli wiesz z wyprzedzeniem, jakie będą Twoje indeksy, możesz je zdefiniować za pomocą reguły .indexOn w regułach zabezpieczeń bazy danych czasu rzeczywistego Firebase, aby poprawić wydajność zapytań.

Definiowanie indeksów danych

Firebase zapewnia potężne narzędzia do porządkowania i przeszukiwania danych. W szczególności Firebase umożliwia wykonywanie zapytań ad hoc w zbiorze węzłów przy użyciu dowolnego wspólnego klucza podrzędnego. Wraz z rozwojem aplikacji spada wydajność tego zapytania. Jeśli jednak poinformujesz Firebase o kluczach, których będziesz szukać, Firebase zindeksuje te klucze na serwerach, poprawiając wydajność zapytań.

Indeksowanie za pomocą orderByChild

Najłatwiej to wyjaśnić na przykładzie. Wszyscy w Firebase zgadzamy się, że dinozaury są całkiem fajne. Oto fragment przykładowej bazy danych faktów dotyczących dinozaurów. Użyjemy go, aby wyjaśnić, 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 zamawiać 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 dinozaura, ponieważ jest to klucz rekordu. Możemy użyć .indexOn , aby poinformować Firebase, aby zoptymalizował 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ł. W powyższym przykładzie umieściliśmy go 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 zademonstrujemy, jak .indexOn współpracuje z orderByValue() . Załóżmy, że tworzymy tabelę wyników sportowych dinozaurów 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"
    }
  }
}