Indeksuj swoje dane

Firebase umożliwia wykonywanie zapytań ad hoc na temat danych przy użyciu dowolnego klucza podrzędnego. 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 Firebase Realtime, aby poprawić wydajność zapytań.

Definiowanie indeksów danych

Firebase zapewnia zaawansowane narzędzia do porządkowania danych i wysyłania zapytań . W szczególności Firebase umożliwia wykonywanie zapytań ad hoc na zbiorze węzłów przy użyciu dowolnego wspólnego klucza podrzędnego. 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 to wyjaśnić na przykładzie. Wszyscy w Firebase zgadzamy się, że dinozaury są całkiem fajne. Oto fragment przykładowej bazy danych zawierającej fakty o dinozaurach. Wykorzystamy go do wyjaśnienia, jak .indexOn współpracuje 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 zamówić dinozaury według imion, wzrostu i długości, ale nigdy według wagi. Możemy poprawić wydajność naszych zapytań, przekazując te informacje Firebase. 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 o optymalizacji zapytań 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 dotyczące 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 wyników sportów dinozaurów z następującymi danymi:

{
  "scores": {
    "bruhathkayosaurus" : 55,
    "lambeosaurus" : 21,
    "linhenykus" : 80,
    "pterodactyl" : 93,
    "stegosaurus" : 5,
    "triceratops" : 22
  }
}

Ponieważ do tworzenia tabeli liderów używamy metody OrderByValue(), możemy zoptymalizować nasze zapytania, dodając regułę .value w naszym węźle /scores :

{
  "rules": {
    "scores": {
      ".indexOn": ".value"
    }
  }
}