私はFacebook Messengerのようなチャットアプリを設計しています。私の2つの現在のルートノードはchats
とusers
です。ユーザーにはチャットの関連リストusers/user/chats
があり、チャットはchats
ノードchats/a151jl1j6
にautoIDで追加されます。そのノードは、メッセージのリスト、最後のメッセージの時刻、誰かが入力しているときなどの情報を保存します。双方向リンクのFirebaseクエリ
私が苦労しているのは、どの2人のユーザーがチャットに参加しているかを定義する場所です。もともと、私はusers/user/chats
ノードのchatIdキーの値として他のユーザーへの参照を入れましたが、グループチャットが欲しいと思っていたのは悪い考えでした。
より具体的にはchats/chat/members
ノードを定義し、userId: true, user2id: true
と定義します。私の問題は、これを効率的にクエリする方法です。たとえば、ユーザーがユーザーと新しいチャットを作成しようとしている場合、チャットが既に存在するかどうかを確認する必要があります。私はどのように "メンバーがcurrentUserId
とfriendUserId
を含んでいるチャットを見つける"の質問をするか、これが効率的な非正規化されたやり方であるかどうかはわかりません。
ヒント
ありがとうございました!だから、これはあなたがユーザーxとの既存の変換をチェックすることです、私は私のチャットを繰り返し、それぞれのxがそれらにあるかどうかを確認するためにそれらをチェックする?これは、私が持っているチャットの量にクエリを制限します。これは安価でなければなりません。 –
はい、それはあなたのアプリのuxにも依存します。ほとんどのチャットアプリにはすべてのチャットの一覧が表示される画面が表示されますので、既存の会話はアプリ内でローカルに保存されますので、ファイアベースで同期されたままになるため、クエリをローカルで行うこともできます。ただし、他の場所からの会話を開始し、既存の会話をたくさん確認する必要がある場合は、会話とそのメンバーを弾性検索(https://github.com/firebase/flashlight)でさらに索引付けして、 1つのクエリで複雑な検索を実行できます。 – ArunV