Lập chỉ mục dữ liệu của bạn

Firebase cho phép bạn thực hiện các truy vấn đặc biệt trên dữ liệu của mình bằng cách sử dụng một khoá con tuỳ ý. Nếu biết trước chỉ mục của mình, bạn có thể xác định chỉ mục đó thông qua quy tắc .indexOn trong Quy tắc bảo mật của Cơ sở dữ liệu theo thời gian thực của Firebase để cải thiện hiệu suất truy vấn.

Xác định chỉ mục dữ liệu

Firebase cung cấp các công cụ mạnh mẽ để sắp xếptruy vấn dữ liệu của bạn. Cụ thể, Firebase cho phép bạn thực hiện các truy vấn đặc biệt trên một tập hợp các nút bằng cách sử dụng bất kỳ khoá con chung nào. Khi ứng dụng của bạn phát triển, hiệu suất của truy vấn này sẽ giảm. Tuy nhiên, nếu bạn cho Firebase biết về các khoá mà bạn sẽ truy vấn, thì Firebase sẽ lập chỉ mục các khoá đó tại máy chủ, giúp cải thiện hiệu suất của các truy vấn.

Lập chỉ mục bằng orderByChild

Cách dễ nhất để giải thích điều này là thông qua một ví dụ. Tất cả chúng tôi tại Firebase đều đồng ý rằng khủng long rất thú vị. Sau đây là một đoạn mã trong cơ sở dữ liệu mẫu về thông tin về khủng long. Chúng ta sẽ dùng ví dụ này để giải thích cách .indexOn hoạt động với orderByChild().

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

Hãy tưởng tượng rằng trong ứng dụng của chúng ta, chúng ta thường cần sắp xếp khủng long theo tên, chiều cao và chiều dài, nhưng không bao giờ theo trọng lượng. Chúng ta có thể cải thiện hiệu suất của các truy vấn bằng cách cho Firebase biết thông tin này. Vì tên của các loài khủng long chỉ là khoá, nên Firebase đã tối ưu hoá cho các truy vấn theo tên khủng long, vì đây là khoá của bản ghi. Chúng ta có thể dùng .indexOn để yêu cầu Firebase tối ưu hoá các truy vấn theo chiều cao và chiều dài:

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

Giống như các quy tắc khác, bạn có thể chỉ định quy tắc .indexOn ở bất kỳ cấp nào trong các quy tắc của mình. Chúng ta đặt nó ở cấp gốc cho ví dụ trên vì tất cả dữ liệu về khủng long đều được lưu trữ ở gốc của cơ sở dữ liệu.

Lập chỉ mục bằng orderByValue

Trong ví dụ này, chúng ta sẽ minh hoạ cách .indexOn hoạt động với orderByValue(). Giả sử chúng ta đang tạo một bảng xếp hạng điểm số thể thao của khủng long với dữ liệu sau:

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

Vì đang sử dụng orderByValue() để tạo bảng xếp hạng, nên chúng ta có thể tối ưu hoá các truy vấn bằng cách thêm quy tắc .value vào nút /scores:

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