Indeksowanie danych

Firebase umożliwia wykonywanie ad hoc zapytań dotyczących danych za pomocą dowolnego klucza podrzędnego. Jeśli wiesz z wyprzedzeniem, jakie indeksy będą używane, 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 sortowania i wyszukiwania danych. Firebase umożliwia wykonywanie zapytań ad hoc dotyczących zbioru węzłów za pomocą dowolnego wspólnego klucza podrzędnego. Wraz z rozwojem aplikacji wydajność tego zapytania spada. Jeśli jednak poinformujesz Firebase o kluczach, których będziesz używać do wysyłania zapytań, Firebase zaindeksuje te klucze na serwerach, co poprawi wydajność zapytań.

Indeksowanie za pomocą orderByChild

Najłatwiej wyjaśnić to na przykładzie. Wszyscy w Firebase zgadzamy się, że dinozaury są naprawdę fajne. Oto fragment przykładowej bazy danych z informacjami o dinozaurach. Użyjemy go, aby wyjaśnić, jak .indexOn współpracuje z orderByChild().

{
  "lambeosaurus": {
    "height" : 2.1,
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "height" : 4,
    "length" : 9,
    "weight" : 2500
  }
}

Załóżmy, że w naszej aplikacji często musimy sortować 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 pod kątem nazwy dinozaura, ponieważ jest to klucz rekordu. Możemy użyć parametru .indexOn, aby polecić Firebase optymalizowanie zapytań pod kątem wysokości i długości:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Podobnie jak w przypadku innych reguł, regułę .indexOn możesz określić na dowolnym poziomie. W przykładzie powyżej znajduje się on na poziomie katalogu głównego, ponieważ wszystkie dane o dinozaurach są przechowywane w katalogu głównym bazy danych.

Indeksowanie za pomocą parametru orderByValue

W tym przykładzie pokażemy, jak działa .indexOn z usługą orderByValue(). Załóżmy, że tworzymy tabelę wyników sportowych dinozaurów z tymi danymi:

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

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

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