Indeksowanie danych

Firebase umożliwia wykonywanie zapytań ad hoc dotyczących danych za pomocą dowolnego klucza podrzędnego. Jeśli znasz z wyprzedzeniem 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 sortowania i wyszukiwania danych. Firebase umożliwia wykonywanie zapytań ad hoc dotyczących kolekcji 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, do których będziesz wysyłać zapytania, 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ą super. Oto fragment przykładowej bazy danych z informacjami o dinozaurach. Wyjaśnimy, 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 sortować dinozaury według nazwy, wysokości i długości, ale nigdy według wagi. Możemy zwiększyć wydajność zapytań, przekazując te informacje 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 pod kątem 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 go na poziomie głównym, ponieważ wszystkie dane o dinozaurach są przechowywane w katalogu głównym bazy danych.

Indeksowanie za pomocą orderByValue

W tym przykładzie pokażemy, jak .indexOn działa 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 funkcji orderByValue(), możemy zoptymalizować zapytania, dodając regułę .value w węźle /scores:

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