建立資料索引

Firebase 可讓您使用任意子項鍵,對資料執行臨時查詢。如果您事先知道索引為何,可以透過 Firebase 即時資料庫安全性規則中的 .indexOn 規則定義索引,提升查詢效能。

定義資料索引

Firebase 提供強大的工具,可排序查詢資料。具體來說,Firebase 可讓您使用任何常見的子項鍵,對節點集合執行臨時查詢。隨著應用程式成長,這項查詢的效能會降低。不過,如果您將要查詢的鍵告知 Firebase,Firebase 就會在伺服器上為這些鍵建立索引,進而提升查詢效能。

使用 orderByChild 建立索引

最簡單的說明方式就是舉例。Firebase 團隊一致認為恐龍很酷。以下是恐龍事實範例資料庫的程式碼片段。我們會用這個範例說明 .indexOn 如何與 orderByChild() 搭配運作。

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

假設在我們的應用程式中,我們經常需要依名稱、高度和長度排序恐龍,但從不需要依重量排序。我們可以將這項資訊提供給 Firebase,藉此提升查詢效能。由於恐龍名稱只是鍵,Firebase 會根據記錄的鍵 (也就是恐龍名稱) 進行查詢,因此已針對查詢進行最佳化。我們可以使用 .indexOn,告訴 Firebase 也要針對高度和長度最佳化查詢:

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

與其他規則一樣,您可以在規則中的任何層級指定 .indexOn 規則。 我們將其放在上述範例的根層級,因為所有恐龍資料都儲存在資料庫的根層級。

使用 orderByValue 建立索引

在這個範例中,我們將示範 .indexOn 如何與 orderByValue() 搭配運作。 假設我們正在製作恐龍運動分數排行榜,並使用下列資料:

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

由於我們使用 orderByValue() 建立排行榜,因此可以在 /scores 節點新增 .value 規則,藉此最佳化查詢:

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