46

Firebaseでデータベーススタイルのクエリを実行する高速な方法はありますか?

例えば:

usersフィールド、、、、をuser_id含むnameFirebaseリファレンスが与えられた場合、age次のようなクエリを実行するための最良の方法は何でしょうか。

SELECT name FROM users WHERE `user_id`=147;

SELECT COUNT(*) FROM users WHERE age=21;
4

3 に答える 3

70

一般的に、いいえ。Firebase は本質的に「リアルタイム データベース」であり、データの変更に応じて常に更新をストリーミングするため、汎用クエリを実行するのはより困難です。今のところ、2 つの (確かに制限された) 照会プリミティブが提供されています。ドキュメントのクエリ/制限ページを参照してください。

多くの場合、さまざまな方法でこれらの制限を回避できます。

  • 場所の名前と優先順位を賢く使用します。データを /users/[userid]/name として構造化すると、/users/147/name を取得するだけで最初の「クエリ」を実行できます。年齢でクエリを実行することがわかっている場合は、年齢をユーザー ノードの優先順位として使用し、"usersRef.startAt(21).endAt(21).on('child_added', ...)" を実行して、 21 歳のすべてのユーザーを取得します。手動でカウントする必要があります。
  • クライアント側のクエリを実行します。 データセット全体が小さい場合は、データセット全体を取得してから、クライアントで手動でフィルタリング/処理できる場合があります。
  • 別のサーバーを実行します。Firebase に接続し、データを同期してから、クライアントの「クエリ」に応答できます。Firebase を介してクライアントと通信することは引き続き可能であり、Firebase は引き続きプライマリ データ ストアになることができますが、別のサーバーがクエリを迅速に実行するための作業を行うことができます。

これは、従来のリレーショナル データベース システムが提供する柔軟なクエリと比較して弱点であることがわかっているため、時間をかけて改善する予定です。

于 2012-07-20T23:21:14.407 に答える
24

もちろん、Lehenbauer 氏は Firebase のすべてのマスターですので、彼の話を聞いてください。;) ただし、この特定のトピックは、私が数週間にわたって取り組んできたトピックです。

「別のサーバーを実行する」および「クライアント側のクエリ」応答を強化するための私の考えのいくつかを次に示します。

エラスティックサーチ (node.js スクリプト)

サーバー上の node.js スクリプトを使用すると、ElasticSearch を統合して、1 時間以内にいくつかの堅実なコンテンツ検索を提供できます。これをさらに簡単にするブログ投稿と lib を次に示します。

キャッシュ可能/共通クエリ

これらは、テーブルを読み取り、データを複製するサーバー/cron プロセスによって処理できます。たとえば、登録時にユーザーのログイン名を「使用不可/使用可能」と表示したいが、複雑な理由で別の一意の ID でユーザー レコードを保存するとします。

私のcron/サーバーは、ユーザーテーブルからすべてのレコードを読み取り、それらをユーザーのレコードIDの値(または知りたい他のデータ)とともに、電子メールアドレスで保存されている別のテーブルに挿入できます。

この重複データのアプローチは、手動キャッシング手法の一種であり、No-SQL 環境では一般的な方法です。スピードと簡素化されたプロセスのために、ストレージスペース(安価で利用可能であると推定されます)を交換しています.

カスタマイズされたクエリ (キューを使用)

カスタム クエリは、XHR (ajax) を介してサーバーに直接送信できます。これにより、困難な作業が行われ、より良い結果が返される可能性があります。または、Firebase を利用して、キューを利用してサーバー バックエンドに接続することもできます。

クライアントは、クエリ リクエストを JSON として呼び出された特別な Firebase テーブルに配置しqueue、レスポンスを待ちます。

サーバーはqueue.on('child_added', ...)`queue_record.child('response', ...data here...) を使用してデータをリッスンし、返します。

これにはいくつかの優れた利点があります。1 つには、任意の数のサーバーがリッスンして応答を提供できるため、負荷分散が簡単になります。このためのコードはセットアップが非常に単純化されており、SOの別のスレッドで説明されています。

これが役に立てば幸いです!

于 2012-07-23T14:19:17.253 に答える