Firebase では、任意の子キーを使用してデータに対するアドホック クエリを実行できます。インデックスをどのようなものにするのかがあらかじめわかっている場合は、Firebase Realtime Database セキュリティ ルールで .indexOn ルールを使用してインデックスを定義し、クエリのパフォーマンスを向上させることができます。
データのインデックスの定義
Firebase には、データの並べ替えとクエリのための強力なツールが用意されています。特に、Firebase では、任意の一般的な子キーを使用してノードのコレクションに対するアドホック クエリを実行できます。アプリの規模が拡大するにつれ、このクエリのパフォーマンスは低下します。ただし、クエリを実行する対象のキーについて Firebase に指示した場合、サーバーにこれらのキーのインデックスが作成され、クエリのパフォーマンスが向上します。
orderByChild を使用したインデックス作成
簡単に説明するために、ここでは例を使用します。Firebase の担当者は皆、恐竜が大好きです。恐竜情報のサンプル データベースの一部を次に示します。このサンプル データベースを使用して、orderByChild() との組み合わせで .indexOn がどのように機能するのかを説明します。
{
"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 によるインデックス作成
この例では、orderByValue() との組み合わせで .indexOn がどのように機能するのかを説明します。たとえば、次のデータを使用して、恐竜のスポーツのスコアから構成されるリーダーボードを作成しているとしましょう。
{
"scores": {
"bruhathkayosaurus" : 55,
"lambeosaurus" : 21,
"linhenykus" : 80,
"pterodactyl" : 93,
"stegosaurus" : 5,
"triceratops" : 22
}
}orderByValue() を使用してリーダーボードを作成しているため、/scores ノードに .value ルールを追加すると、クエリを最適化できます。
{
"rules": {
"scores": {
".indexOn": ".value"
}
}
}