Cloud Firestore データベースの中にいくつかのコレクションがあり、その中にサブコレクションを持つドキュメントが含まれるという構造にすることもできます。こういったサブコレクションには、別のサブコレクションを持つドキュメントなどを含めることができます。
この新しい構造によって、データに対してクエリを実行する際に重要になるいくつかのメリットが得られます。
まず、すべてのクエリは
浅く なります。つまり、ドキュメント配下のサブコレクションに紐付くデータをすべて取得せずに、そのドキュメントだけを取得することができます。これによって、不必要なデータを大量にダウンロードすることを心配せずに、論理的に妥当な形でデータ階層を格納することができるようになります。
この例では、サブコレクションに属するドキュメントを取得せずに、上のドキュメントだけを取得できる
次に、Cloud Firestore には Realtime Database よりも強力なクエリ機能が搭載されています。Realtime Database では、複数の項目にまたがるクエリを作成するには多くの作業が必要で、通常はデータを非正規化しなければなりません。
たとえば、都市の一覧があり、カリフォルニア州にある人口 50 万人を超えるすべての都市を探したいとしましょう。
Realtime Database に格納された都市
Realtime Database では、「州(state)+人口(population)」という項目を作成し、その項目に対してクエリを実行しなければなりませんでした。
クエリのためだけに state_and_pop という組み合わせ項目を作成
Cloud Firestore では、その作業は不要になります。場合によっては、Cloud Firestore は自動的に複数の項目を検索してくれます。今回の都市の例はそれには該当しませんが、そのような場合でも、Cloud Firestore はクエリを実現するために必要になるインデックスの構築を自動的に提示してくれます。
それさえ済めば、あとは複数の項目を使って検索するだけです。
Cloud Firestore は、アプリが有効である間、このインデックスを自動的にメンテナンスしてくれます。もう項目を組み合わせる必要はなくなります。
大規模に対応したデザイン
Realtime Database は
ほとんどの アプリのニーズを満たす規模に拡大できますが、アプリの人気が非常に高まったり、データセットが巨大になると、問題が起こり始めることもあります。
一方の Cloud Firestore は、
絶大な人気を誇るいくつかのアプリ を支えているのと同じ Google Cloud インフラストラクチャ上に構築されています。そのため、スケールアップがはるかに簡単で、容量も Realtime Database よりはるかに大きくなります。
また、クエリの構造が新しくなっているため、すべての Cloud Firestore クエリは、データのサイズではなく結果セットのサイズに対応します。つまり、レストランのレビューアプリでシカゴのトップ 10 レストランを検索する場合、データベース内にあるレストランが 300 店であっても、30 万店であっても、3000 万店であっても、かかる時間は同じです。あるエンジニアは、「Cloud Firestore で遅いクエリを作るのは基本的に不可能だ」と述べています。
ベータ版期間が始まる時点で、Cloud Firestore は既に Realtime Database を超える規模にスケールアップできるようになっています。ただし、実際の用途に近い使われ方をした際のデータベース性能を監視できるように、いくつかの制限も設けられています。しかし、ベータ版期間が終了し、一般提供版のリリースが近づく頃には、Cloud Firestore は途方もないレベル
2 にまで自動的に拡張できるようになりますので、ご期待ください。
データの手動取得が簡単
Realtime Database のリアルタイム性は、チャットなどの機能や魔法のような共同作業体験を提供する際にとても役立つというデベロッパーがいます。しかし一方で、「必要なときにデータを取得する」的な従来型の単純なサービスに Realtime Database を利用しているデベロッパーも多いことがわかっています。
Realtime Database で
.once
を呼び出すとこのようなユースケースに対応できますが、これを使うのは少しばかり不自然であり、SDK でもこの機能はストリーミング メソッドの補助的な役割を提供するものになっています。Cloud Firestore では、単純な一度きりの取得クエリがより自然な形で書けるようになり、それが Firestore API のプライマリ ユースケースになっています。
もちろん、リスナーもサポートされているので、データベース内のデータが変更されたときにアップデートを受信する機能をクライアントに持たせることもできます。つまり、好きな方法でデータを取得できる柔軟性が追加されています。
信頼性を向上させるマルチリージョン サポート
Cloud Firestore は、マルチリージョン データベースです。つまり、データは地理的に独立した別々のリージョンに自動で即時コピーされます。そのため、予期せぬ災害が発生してデータセンターやリージョン全体がオフラインになったとしても、データは安全であることが保証されます。
また、データベース ファンの皆さん向けにお伝えすると、このマルチリージョン データベースは(Cloud Spanner のような)強い整合性を備えています。つまり、マルチリージョンをサポートしつつ、いつ読み取りを行っても最新版のデータを取得できるというメリットがあります。
異なる価格モデル
この 2 つのデータベースには、まったく異なる価格モデルが設定されています。Realtime Database の費用は、主にダウンロードされたデータの
量 とデータベースに格納しているデータの量によって決まります。
Cloud Firestore もこれらの量に応じて課金されるものの、Realtime Database に比べて
非常に 低い額になっています
3 。その代わり、Cloud Firestore の料金は、主に読み取りと書き込みの
実行回数 によって決まります。
つまり、クライアントがデータベースから大量のデータをたまにリクエストするだけの従来型のモバイルアプリの場合、同じアプリでも Realtime Database の価格モデルより Cloud Firestore の方が有利かもしれません。たとえば、ニュースアプリや出会い系アプリ、ターン制のマルチプレーヤー型ゲームなどがこれにあたるでしょう。
一方で、1 秒間に行うクライアント当たりの読み込み数や書き込み数が非常に多いアプリ(たとえば、全員の書き込みが 1 秒間に何度もブロードキャストされる可能性があるホワイトボード共有アプリ)では、おそらく Cloud Firestore の方が高価になるでしょう。
4 少なくとも、アプリのその部分については、ここに記載した説明が当てはまります。ただし、両方のデータベースを併用することができ、そうすることには何の問題もありません。
もちろん、ここに記したのは大まかなガイドラインです。Cloud Firestore の詳しい価格設定については、ドキュメントの
価格セクション をご覧ください。
Realtime Database を使い続ける方がよい場合
以上のような変更点だけを聞くと、単純に Realtime Database よりも Cloud Firestore の方が優れているという印象を受けるかもしれません。実際、Cloud Firestore には Realtime Database を改善した点もかなり多く含まれていますが、Realtime Database を使うことを考慮した方がよいデータもあります。具体的には、次のような場合です。
レイテンシの面では、Realtime Database の方がわずかに優れているようです。通常は大きな差が出ることはありませんが(データベースからクライアントまでで数百ミリ秒程度)、即時性重視のアプリで、安定した低レイテンシでアップデートできるデータベースが必要な場合は、Realtime Database の方が適しているかもしれません。
Realtime Database は、 プレゼンス をネイティブ サポートしています。これは、ユーザーがオンラインになった場合やオフラインになった場合に通知してくれる機能です。Cloud Firestore で同じことを行うソリューション もありますが、あまり簡単とは言えない方法です。
前述のように、Cloud Firestore の価格モデルでは、1 秒間に行われるクライアント当たりの読み取り数や書き込み数が非常に多く、それぞれが小さなものである場合、同じ操作を行う Realtime Database アプリよりも大幅に高価になる場合があります。
現在、Cloud Firestore はベータ版の製品です。Realtime Database は 4 年にわたって何十万もの本番環境向けアプリで利用されている歴戦のデータベースです。Cloud Firestore は、ここ数か月間で数十個のアプリによって限定的に本番利用されています。こういったアプリの中には、HomeAway や Hawkin Dynamics のように実際に公開され、優れたパフォーマンスを発揮しているものもあります。しかし、Cloud Firestore にはまだ見つかっていない問題やエッジケースが存在する可能性もあります。
長すぎて読めないという皆さん、使い方を教えてください!
一般的には、
新しい アプリには Cloud Firestore を使ってみることをおすすめしています。ただし、Realtime Database を使う方が望ましい前述のような特別なニーズがある場合は除きます。
一方で、Realtime Database で問題なく動作している
既存 のデータベースがある場合は、それを使い続ける方がよいでしょう。Cloud Firestore がとても役立ったという問題を見つけた方は、データベースの切り替えを行うか、データの一部を Cloud Firestore に移行して両方のデータベースを併用してください。しかし、切り替えのための切り替えは行うべきではありません。
なお、「データベースを Realtime Database から Cloud Firestore に変換する」魔法のボタンは探しても見つかりませんので、あしからず
5 。率直なところ、今後もそのような機能が実現されるかはわかりません。この 2 つのデータベースやクエリ、価格構造の違いを考えると、Realtime Database に最適化されているデータベースを単純に Cloud Firestore に変換しても、必ずしも優れたエクスペリエンスは提供できないでしょう。この種の変更を行う場合は、ぜひじっくりと考えるようにしてください。
試してみたい方へ
Cloud Firestore を試してみたいという方向けに、さまざまなものが準備されています。
ドキュメント や
Google の
サンプル アプリ 、
インタラクティブ コードラボ 、
スタート ガイド 動画 などをご覧ください。
皆さんが Cloud Firestore を使ってできることはたくさんあるはずです。皆さんがこれを使って作るアプリを楽しみにしています。いつものように、質問がある方はいずれかの
サポート チャンネル を通してご連絡ください。または、
google-cloud-firestore
および firebase
タグをつけて Stack Overflow に投稿してください。ぜひお楽しみください。グッドラック!
注
Reviewed by
Khanh LeViet - Developer Relations Team
この記事は デベロッパー アドボケート、 Todd Kerpelman による The Firebase Blog の記事 "Cloud Firestore for Realtime Database Developers " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
皆さんはもうこのビッグニュース を聞きましたか?なんと先日、Cloud Firestore のベータ版がリリースされました。これは、アプリのデータを簡単にクラウドに保存して同期できる新しいデータベースで、リアルタイムにも対応しています!
ここで、既視感のようなものを感じる方もいらっしゃるかもしれません。皆さんが既に使っているかもしれない別の製品、Firebase Realtime Database にとてもよく似た響きですね。ですから、既視感を感じるのも自然です。
では、なぜ別のデータベースができたのでしょうか。そして、どんなときにどちらを選べばよいのでしょうか。ここでは、Cloud Firestore の新機能と特徴、そして皆さんが次のアプリでこれを使ってみたくなる理由について説明します。
Cloud Firestore の特徴
ドキュメント には、Realtime Database と Cloud Firestore の相違点がすべて詳しく記載されていますが、ここでは、この 2 つの製品の主な相違点について見てみましょう。まず、1 点目です。
データがより構造化されており、クエリが得意
Firebase Realtime Database は基本的に巨大な JSON ツリーで、いわば何でもありの無法地帯でしたが1 、一方の Cloud Firestore はデータがより構造化されています。Cloud Firestore はドキュメントモデルのデータベースなので、すべてのデータはキーと値のペアの集まりでできた ドキュメント と呼ばれるオブジェクトに格納されます。値には、文字列、浮動小数点数、バイナリデータ、JSON のように見える マップ と呼ばれるオブジェクトなどをいくつでも格納できます。こういったドキュメントは、グループごとに コレクション と呼ばれるオブジェクトなどをいくつでも格納できます。
Cloud Firestore データベースの中にいくつかのコレクションがあり、その中にサブコレクションを持つドキュメントが含まれるという構造にすることもできます。こういったサブコレクションには、別のサブコレクションを持つドキュメントなどを含めることができます。
この新しい構造によって、データに対してクエリを実行する際に重要になるいくつかのメリットが得られます。
まず、すべてのクエリは 浅く なります。つまり、ドキュメント配下のサブコレクションに紐付くデータをすべて取得せずに、そのドキュメントだけを取得することができます。これによって、不必要なデータを大量にダウンロードすることを心配せずに、論理的に妥当な形でデータ階層を格納することができるようになります。
この例では、サブコレクションに属するドキュメントを取得せずに、上のドキュメントだけを取得できる
次に、Cloud Firestore には Realtime Database よりも強力なクエリ機能が搭載されています。Realtime Database では、複数の項目にまたがるクエリを作成するには多くの作業が必要で、通常はデータを非正規化しなければなりません。
たとえば、都市の一覧があり、カリフォルニア州にある人口 50 万人を超えるすべての都市を探したいとしましょう。
Realtime Database に格納された都市
Realtime Database では、「州(state)+人口(population)」という項目を作成し、その項目に対してクエリを実行しなければなりませんでした。
クエリのためだけに state_and_pop という組み合わせ項目を作成
Cloud Firestore では、その作業は不要になります。場合によっては、Cloud Firestore は自動的に複数の項目を検索してくれます。今回の都市の例はそれには該当しませんが、そのような場合でも、Cloud Firestore はクエリを実現するために必要になるインデックスの構築を自動的に提示してくれます。
それさえ済めば、あとは複数の項目を使って検索するだけです。
Cloud Firestore は、アプリが有効である間、このインデックスを自動的にメンテナンスしてくれます。もう項目を組み合わせる必要はなくなります。
大規模に対応したデザイン
Realtime Database は ほとんどの アプリのニーズを満たす規模に拡大できますが、アプリの人気が非常に高まったり、データセットが巨大になると、問題が起こり始めることもあります。
一方の Cloud Firestore は、絶大な人気を誇るいくつかのアプリ を支えているのと同じ Google Cloud インフラストラクチャ上に構築されています。そのため、スケールアップがはるかに簡単で、容量も Realtime Database よりはるかに大きくなります。
また、クエリの構造が新しくなっているため、すべての Cloud Firestore クエリは、データのサイズではなく結果セットのサイズに対応します。つまり、レストランのレビューアプリでシカゴのトップ 10 レストランを検索する場合、データベース内にあるレストランが 300 店であっても、30 万店であっても、3000 万店であっても、かかる時間は同じです。あるエンジニアは、「Cloud Firestore で遅いクエリを作るのは基本的に不可能だ」と述べています。
ベータ版期間が始まる時点で、Cloud Firestore は既に Realtime Database を超える規模にスケールアップできるようになっています。ただし、実際の用途に近い使われ方をした際のデータベース性能を監視できるように、いくつかの制限も設けられています。しかし、ベータ版期間が終了し、一般提供版のリリースが近づく頃には、Cloud Firestore は途方もないレベル2 にまで自動的に拡張できるようになりますので、ご期待ください。
データの手動取得が簡単
Realtime Database のリアルタイム性は、チャットなどの機能や魔法のような共同作業体験を提供する際にとても役立つというデベロッパーがいます。しかし一方で、「必要なときにデータを取得する」的な従来型の単純なサービスに Realtime Database を利用しているデベロッパーも多いことがわかっています。
Realtime Database で .once
を呼び出すとこのようなユースケースに対応できますが、これを使うのは少しばかり不自然であり、SDK でもこの機能はストリーミング メソッドの補助的な役割を提供するものになっています。Cloud Firestore では、単純な一度きりの取得クエリがより自然な形で書けるようになり、それが Firestore API のプライマリ ユースケースになっています。
もちろん、リスナーもサポートされているので、データベース内のデータが変更されたときにアップデートを受信する機能をクライアントに持たせることもできます。つまり、好きな方法でデータを取得できる柔軟性が追加されています。
信頼性を向上させるマルチリージョン サポート
Cloud Firestore は、マルチリージョン データベースです。つまり、データは地理的に独立した別々のリージョンに自動で即時コピーされます。そのため、予期せぬ災害が発生してデータセンターやリージョン全体がオフラインになったとしても、データは安全であることが保証されます。
また、データベース ファンの皆さん向けにお伝えすると、このマルチリージョン データベースは(Cloud Spanner のような)強い整合性を備えています。つまり、マルチリージョンをサポートしつつ、いつ読み取りを行っても最新版のデータを取得できるというメリットがあります。
異なる価格モデル
この 2 つのデータベースには、まったく異なる価格モデルが設定されています。Realtime Database の費用は、主にダウンロードされたデータの 量 とデータベースに格納しているデータの量によって決まります。
Cloud Firestore もこれらの量に応じて課金されるものの、Realtime Database に比べて 非常に 低い額になっています3 。その代わり、Cloud Firestore の料金は、主に読み取りと書き込みの 実行回数 によって決まります。
つまり、クライアントがデータベースから大量のデータをたまにリクエストするだけの従来型のモバイルアプリの場合、同じアプリでも Realtime Database の価格モデルより Cloud Firestore の方が有利かもしれません。たとえば、ニュースアプリや出会い系アプリ、ターン制のマルチプレーヤー型ゲームなどがこれにあたるでしょう。
一方で、1 秒間に行うクライアント当たりの読み込み数や書き込み数が非常に多いアプリ(たとえば、全員の書き込みが 1 秒間に何度もブロードキャストされる可能性があるホワイトボード共有アプリ)では、おそらく Cloud Firestore の方が高価になるでしょう。4 少なくとも、アプリのその部分については、ここに記載した説明が当てはまります。ただし、両方のデータベースを併用することができ、そうすることには何の問題もありません。
もちろん、ここに記したのは大まかなガイドラインです。Cloud Firestore の詳しい価格設定については、ドキュメントの価格セクション をご覧ください。
Realtime Database を使い続ける方がよい場合
以上のような変更点だけを聞くと、単純に Realtime Database よりも Cloud Firestore の方が優れているという印象を受けるかもしれません。実際、Cloud Firestore には Realtime Database を改善した点もかなり多く含まれていますが、Realtime Database を使うことを考慮した方がよいデータもあります。具体的には、次のような場合です。
レイテンシの面では、Realtime Database の方がわずかに優れているようです。通常は大きな差が出ることはありませんが(データベースからクライアントまでで数百ミリ秒程度)、即時性重視のアプリで、安定した低レイテンシでアップデートできるデータベースが必要な場合は、Realtime Database の方が適しているかもしれません。
Realtime Database は、 プレゼンス をネイティブ サポートしています。これは、ユーザーがオンラインになった場合やオフラインになった場合に通知してくれる機能です。Cloud Firestore で同じことを行うソリューション もありますが、あまり簡単とは言えない方法です。
前述のように、Cloud Firestore の価格モデルでは、1 秒間に行われるクライアント当たりの読み取り数や書き込み数が非常に多く、それぞれが小さなものである場合、同じ操作を行う Realtime Database アプリよりも大幅に高価になる場合があります。
現在、Cloud Firestore はベータ版の製品です。Realtime Database は 4 年にわたって何十万もの本番環境向けアプリで利用されている歴戦のデータベースです。Cloud Firestore は、ここ数か月間で数十個のアプリによって限定的に本番利用されています。こういったアプリの中には、HomeAway や Hawkin Dynamics のように実際に公開され、優れたパフォーマンスを発揮しているものもあります。しかし、Cloud Firestore にはまだ見つかっていない問題やエッジケースが存在する可能性もあります。
長すぎて読めないという皆さん、使い方を教えてください!
一般的には、 新しい アプリには Cloud Firestore を使ってみることをおすすめしています。ただし、Realtime Database を使う方が望ましい前述のような特別なニーズがある場合は除きます。
一方で、Realtime Database で問題なく動作している 既存 のデータベースがある場合は、それを使い続ける方がよいでしょう。Cloud Firestore がとても役立ったという問題を見つけた方は、データベースの切り替えを行うか、データの一部を Cloud Firestore に移行して両方のデータベースを併用してください。しかし、切り替えのための切り替えは行うべきではありません。
なお、「データベースを Realtime Database から Cloud Firestore に変換する」魔法のボタンは探しても見つかりませんので、あしからず5 。率直なところ、今後もそのような機能が実現されるかはわかりません。この 2 つのデータベースやクエリ、価格構造の違いを考えると、Realtime Database に最適化されているデータベースを単純に Cloud Firestore に変換しても、必ずしも優れたエクスペリエンスは提供できないでしょう。この種の変更を行う場合は、ぜひじっくりと考えるようにしてください。
試してみたい方へ
Cloud Firestore を試してみたいという方向けに、さまざまなものが準備されています。ドキュメント や Google の サンプル アプリ 、インタラクティブ コードラボ 、スタート ガイド 動画 などをご覧ください。
皆さんが Cloud Firestore を使ってできることはたくさんあるはずです。皆さんがこれを使って作るアプリを楽しみにしています。いつものように、質問がある方はいずれかのサポート チャンネル を通してご連絡ください。または、google-cloud-firestore
および firebase
タグ をつけて Stack Overflow に投稿してください。ぜひお楽しみください。グッドラック!
注
Reviewed by Khanh LeViet - Developer Relations Team